< 문제 >
배열을 받아서 나이를 오름차순으로 정렬을 하고, 각 개인의 퍼스트네임과 라스트네임을 요소로 하는 배열을 리턴한다.
<입력>
인자1: arr
<주의사항>
let peopleList = [
[
['firstName', '비'],
['age', 17],
['job', 'singer']
],
[
['firstName', '이'],
['lastName', '효리'],
['age', 22],
['job', 'singer'],
],
[
['lastName', '재석'],
['age', 27],
['job', 'comedian']
],
];
입출력 예시
let output = result(peopleList);
console.log(output()); // -> ['비', '이효리', '재석']
- map을 활용하여 배열을 객체로 만들 수 있다.
- reduce는 map처럼 활용도 가능하다
- Object.fromEntries()
- Array.prototype.findIndex()
우선 위의 문제를 풀기 위해서 나는 가장 안에 있는 배열을 객체로 만들어야 한다고 생각했다. 그래서 map함수를 활용하여 객체로 만들었다.
const arr = [[[1,2]],[[3,4]],[[5,6]]];
const transformedArr = arr.map(function(ar){
return ar.map(function(a){
let obj = {};
for(let i = 0; i < 1; i++){
obj[a[0]] = a[1];
};
return obj;
});
})
console.log(transformedArr) // [[{1:2}],[{3:4}],[{5:6}]]
오호라!!!😃 드디어 배열을 객체로 만들기 성공! 그래서 나는 나이를 정렬하면 되겠구나하고 다음 단계에 넘어갔다. sort 함수를 사용해서 객체를 정렬하는 방법을 이용해서 풀려고 했다. 하지만 정렬이 되지 않았다.
계속 해보았지만 되지 않았다.....😭
그 원인은 한 배열 안에 있는 객체들은 다른 키를 가지고 있기 때문에 정렬이 되지 않았던 것이였다. 그래서 나는 한 배열 안에 있는 각 객체들을 합칠 생각을 하였다...
뭔가 문제가 산으로 가고 있는 느낌이였다.
결국 3일 만에 답을 찾을 수 있었는데, 푼 것은 아니고 인터넷에 동일한 문제가 있어 해답을 보았다. 정답에는 내가 그동안 풀면서 필요했던, 내가 알지 못한 새로운 함수들이 있었다.
Array 메소드
와 Object 메소드
들 좀 공부 좀 해야겠다!⭐이 메소드는 어떤 배열이 키와 값을 쌍의 목록을 가지고 있다면 객체로 바꿔주는 메소드이다.
이를테면 다음과 같다.
const keyValArr = [ ['name','루씨'], ['age',17], ['city','NewYork'] ];
const obj = Object.fromEntries(keyValArr);
console.log(obj); // {name: "루씨", age: 17, city: "NewYork"}
- 나이 순으로 정렬된 배열을 객체로 만든다.(Object.fromEntries()__ 다만 주어진 변수 peopleList는 삼차원 배열이기 때문에 한 단계들어가기 map함수 사용)
- 나이 순으로 정렬하기 (sort 함수 사용)
let compare = (a,b) => a.age - b.age;
function sortList(arr){
// map메소드사용 - arr를 받아 2번째 arr와 3번째 arr를 오브젝트로 만든다.
const changeToObj = arr.map(el => Object.fromEntries(el));
// sort메소드사용 - 나이를 오름차순으로 정렬한다.
return changeToObj.sort(compare);
}
const objListArr = sortList(peopleList);
- 2번의 결과 값으로 조건에 맞춰 이름을 새 배열에 push한다.
- 경우1: firstName과 lastName 둘 다 있는 경우
- 경우2: firstName만 있는 경우
- 경우3: lastName만 있는 경우
function nameList(arr) {
let result = [];
for(let i = 0; i < arr.length; i++) {
const firName = arr[i].firstName; // firstName의 값을 변수로 할당
const lastName = arr[i].lastName; // lastName의 값을 변수로 할당
if(firName && lastName) {
result.push(firName+lastName);
} else if(firName) {
result.push(firName);
} else if (lastName) {
result.push(lastName);
}
}
return result;
}
console.log(nameList(objListArr1)) // ["비", "이효리", "재석"]
시험이 끝나고 3일동안 여러 방법을 사용해가면서 이 문제를 풀려고 하였다. 결국 이 문제와 동일한 문제를 인터넷에서 찾게 되었다. 내가 답을 보고 느낀점은 내가 아는 방법 말고 새로운 방법을 알아보는 스킬도 지녀야겠다는 것이다.
모르는 문제를 풀기 위해 나름 여러 방법을 써왔다. 그리고 그 안에서 새롭게 안 사실도 많아 포스팅이 길었다. 비록 내가 해결한 문제는 아니지만 포기하지 않고 해결법을 찾아낸 나 자신에게 박수.😃 짝짝짝!