2017-04-25 1 views
0

없이 내부 객체를 무시 I 나는 새로운 객체 병합 원하는 두 개체가 첫 번째 개체가 구글 차트의 기본 옵션입니다 있습니다병합 개체는 병합

optionsA = { 
    height: 500, 
    focusTarget: 'category', 
    hAxis: { 
     showTextEvery: 0, 
     slantedText: true, 
     slantedTextAngle: 45, 
     format: 'date', 
    }, 
} 

으로 내 두 번째 객체 hAxis에 몇 가지 속성을 추가하고 현재 값을 새 값으로 대체하려고합니다. 그러나 기본적으로이 옵션을 optionsA에 유지하려고합니다.

이 내 두 번째 객체입니다

optionsA = { 
    isStacked: true, 
    hAxis: { 
     gridlines: { 
     count: 10 
     }, 
     format: 'percent', 
    }, 
} 

이러한 개체

가 더 복잡하지만 합병을 시도 object.assign 결과가 있다는 것입니다 때 나는 질문

을 단순화하기 위해 속성을 감소 개체 B는 새 개체에 새 루트 속성을 추가하지만 hAxis의 속성은 optionsB의 옵션으로 완전히 재정의됩니다. , hAxis에서

{ 
    height: 500, 
    focusTarget: 'category',  
    isStacked: true, 
    hAxis: { 
     gridlines: { 
     count: 10 
     }, 
     format: 'percent', 
    }, 
} 

속성은 완전히 새로운 속성 오버라이드 (override)됩니다

{ 
    height: 500, 
    focusTarget: 'category',  
    isStacked: true, 
    hAxis: { 
     gridlines: { 
     count: 10 
     }, 
     format: 'percent', 
     showTextEvery: 0, 
     slantedText: true, 
     slantedTextAngle: 45, 
    }, 
} 

대신이의 나는이 무엇입니까 :

let newObj = Object.assign({}, optionsA, optionsB); 

이 내가 예상 할 개체입니다 내 문제는 뭐니?

+2

'Object.assign()'은 소스 객체의 최상위 속성에서만 작동합니다. 하위 오브젝트로 "내려 앉지"않습니다. – Pointy

+0

참조 : http://stackoverflow.com/questions/27936772/how-to-deep-merge-instead-of-shallow-merge –

+1

'Object.assign ({}, optionsA, optionsB, {hAxis : Object. assign ({}, optionsA.hAxis, optionsB).hAxis)})'해야한다 – Bergi

답변

0

두 개체에서 모두 동일한 속성을 사용하고 있기 때문입니다.

나중에 매개 변수 순서에서 동일한 속성을 가진 다른 개체가 속성을 덮어 씁니다.

MDN에 assign의 예를 보겠습니다.

제 제안은 동일한 속성을 먼저 병합합니다. 중첩 깊이없는 경우

optionsA = { 
 
    height: 500, 
 
    focusTarget: 'category', 
 
    hAxis: { 
 
     showTextEvery: 0, 
 
     slantedText: true, 
 
     slantedTextAngle: 45, 
 
     format: 'date', 
 
    }, 
 
} 
 
optionsB = { 
 
    isStacked: true, 
 
    hAxis: { 
 
     gridlines: { 
 
     count: 10 
 
     }, 
 
     format: 'percent', 
 
    }, 
 
} 
 
Object.assign(optionsA.hAxis, optionsB.hAxis); 
 
let newObj = Object.assign({}, optionsB, optionsA); 
 
console.log(newObj);

+0

좋은 aproach 그러나 나를 위해 일하지 않는다, 이것은 객체의 간단한 예제이다. 실제로 내가 병합해야 할 많은 속성들이있다. – xzegga

+1

네, 여기 당신이 찾고있는 것 같아요. 희망이 도움이 :) http://stackoverflow.com/a/383245/4886453 –

+0

고맙습니다 @ 타이 - 레이 내 하루를 구할! – xzegga

0

, 당신은 다음과 같은 두 단계로 병합 프로세스를 중단 할 수 있습니다

optionsA = { 
 
    height: 500, 
 
    focusTarget: 'category', 
 
    hAxis: { 
 
     showTextEvery: 0, 
 
     slantedText: true, 
 
     slantedTextAngle: 45, 
 
     format: 'date', 
 
    } 
 
}; 
 

 
optionsB = { 
 
    isStacked: true, 
 
    hAxis: { 
 
     gridlines: { 
 
     count: 10 
 
     }, 
 
     format: 'percent', 
 
    } 
 
}; 
 

 
let newNestedMerged = Object.assign({},optionsA.hAxis, optionsB.hAxis); 
 
optionsA.hAxis = newNestedMerged; 
 
optionsB.hAxis = newNestedMerged; 
 
let newObj = Object.assign(optionsA, optionsB); 
 
console.log(newObj);

이 도움을합니까 ?