자바스크립트 객체 생성 관련 질문입니다


#1

function createObj( arr, value ) {

}
arr는 배열형태의 키값이 [ “a1”, “a2”, “a3” …] 순서대로 넘어오고 그 길이는 정해져있지 않습니다.
value는 마지막 키값에 배당해줄 값입니다.

a1 : {
a2 : {
a3 : value
}
}
이런 동작을 하는 function을 구현하고 싶은데 지저분한 코드로 밖에 구현이 안됩니다.
깔끔하게 할 수 있는 방법이 있을까요?


(Joseph Kim) #2
function createObj(arr,value) { return arr.reduceRight((obj, key)=>({[key]:obj}),value)}

#4

감사합니다!!


#5

만약 객체의 특정 키값의 value를 바꿔주는 function을 만들어야 한다면
키값을 가지고 있는 배열을 활용하여 바꿀 수 있는 방법이 있을까요?

a1_1: { a2_1: "", a2_2: "", a2_2: { a3_1: "", a3_2: "", a3_3: {} //..... }, // ..... }
이런 객체에서 a3_3의 value를 바꾸고 싶다고 한다면
changeObjValue([“a1_1”, “a2_2”, “a3_3”], value) 형태로 전달할 것입니다.

지금 제가 쓰고 있는 형태는 a1_1 자체를 아예 새로 만들어서 필요한 값을 변경하여 사용하고 있는데
그렇게 하니까 DOM에서 추적이 안되는 문제를 겪고 있습니다.


(Joseph Kim) #6

에러 잡는 건 다 무시하고, 이런 식으로 오브젝트의 값을 바꿀 수 있을 것 같습니다.

const obj_sample = {
a1: {
b1:‘b1’,
b2:{
c1:{
d1:‘d1’,
d2:‘d2’,
d3:‘d3’
},
c2:‘c2’
},
b3:‘b3’
},
a2:‘a2’
}

function mutateDeeper (obj, keys, value) {
let target = obj;
const lastkey = keys.pop();
keys.forEach(key=>target=target[key]);
target[lastkey] = value;
}
console.log(‘original’, obj_sample);

mutateDeeper(obj_sample,[‘a1’,‘b2’,‘c1’,‘d3’],‘new value’);

console.log(‘mutated’, obj_sample)