다음과 같은 JSON 객체가 있다고 가정해 보겠습니다.
const obj = {
"test1": [{
"1": {
"rssi": -25,
}
}, {
"2": {
"rssi": -25,
}
}],
"test2": [{
"15": {
"rssi": -10,
} }, {
"19": {
"rssi": -21,
}
}]
};여기서 우리는 이런 구조의 객체를 입력받아, 모든 중첩 객체에 담긴 "rssi" 속성 값을 대응되는 중첩 배열, 즉 '배열의 배열' 형태로 변환하는 JavaScript 함수를 작성해야 합니다.
따라서 위 객체에 대한 출력 결과는 다음과 같아야 합니다.
const output = [[-25, -25], [-10, -21]];
구현 예시
const obj = {
"test1": [{
"1": {
"rssi": -25,
}
}, {
"2": {
"rssi": -25,
}
}],
"test2": [
{
"15":
{ "rssi": -10,
}
}, {
"19": {
"rssi": -21,
}
}]
};
const mapToValues = (object = {}) => {
const res = [];
for (let key in object) {
let obj = object[key];
let aux = [];
for (let i = 0; i < obj.length; i++) {
for (x in obj[i]) {
aux.push(obj[i][x].rssi);
}
}
res.push(aux);
}
return res;
};
console.log(mapToValues(obj));출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[ [ -25, -25 ], [ -10, -21 ] ]
코드 동작 원리
mapToValues 함수는 for...in 루프를 사용해 최상위 객체의 각 키(test1, test2)를 순회합니다. 각 키의 값은 여러 개의 객체를 담고 있는 배열이므로, 내부 반복문으로 배열의 요소를 하나씩 확인한 뒤, 각 요소 객체의 키를 다시 순회하면서 rssi 값을 임시 배열(aux)에 차례대로 저장합니다. 완성된 임시 배열을 결과 배열(res)에 추가하면, 키별로 rssi 값이 그룹화된 2차원 배열을 얻을 수 있습니다.
참고로 for (x in obj[i])에서 변수 x를 선언하지 않으면 전역 변수가 되어 의도치 않은 동작을 일으킬 수 있으므로, 실무 코드에서는 for (let x in obj[i])처럼 반드시 선언해 주는 것이 좋습니다.