2017-09-25 1 views
1

2つのオブジェクトがあり、同じ値を上書きするだけで1つに結合したいと考えています。ディープコピーを持たず、オブジェクトの配列を上書きしない2つのオブジェクトを拡張する

var objOne = { current: 1, sort: { 'foo' : 'bar' }, search: [ { name: 'a', value: 1 }, { name: 'b', value: 2 } ] }; 
var objTwo = { sort: { 'john' : 'doe' }, search: [ { name: 'a', value: 3 } ] }; 

ディープコピーなしで$ .extendsを試してみましたが、配列オブジェクトを除くすべての要素でうまく動作します。

var objAll = $.extend({}, objOne, objTwo); 

objAll -> { current: 1, sort: { 'john' : 'doe' }, search: [{ name: 'a', value: 3 }] }; 

私の目標は、同じ名前を持つオブジェクトのこの

objAll -> { current: 1, sort: { 'john' : 'doe' }, search: [{ name: 'a', value: 3 },{ name: 'b', value: 2 }] }; 

上書きのみ配列を取得することです。

どうすればいいですか?ありがとう

+0

あなたは配列に更新するかを、知っていますか2 foreachの –

+0

でオブジェクトを作成? –

+0

最後に上書きします($ extendのように) –

答えて

0

これは、ES6プロキシを使用して、ハンドラでset trapを使用して実行できます。

var objOne = { current: 1, sort: { 'foo' : 'bar' }, search: [ { name: 'a', value: 1 }, { name: 'b', value: 2 } ] }; 

var proxy = new Proxy(objOne, { 
     set(trapTarget, key, value, receiver) { 
       // not altering the existing array properties 
       if (trapTarget.hasOwnProperty(key) && Array.isArray(trapTarget[key])) { 

       return Reflect.set(trapTarget, key, trapTarget[key], receiver) 
       } 

       return Reflect.set(trapTarget, key, value, receiver); 

     } }); 

Object.assign(proxy,{ sort: { 'john' : 'doe' }, search: [ { name: 'a', value: 3 } ] }); 

console.log(objOne); 

JsFiddleリンク:https://jsfiddle.net/8n3c8hs0/

+0

残念なことに、ソートオブジェクトでは機能しますが、配列検索では機能しません。実際には、[{name: 'a'、value:1}、{name: 'b'、value:2} 'という検索結果を返し、[{name:' a '、value:3}、{名前: 'b'、値:2}] –

関連する問題