2017-01-26 8 views
0

2つのjavascriptオブジェクトを同じようなプロパティのレジューサーで深くマージしたいと思います。キャッチは2つのオブジェクトのプロパティとして配列を持っているので、置き換えずに連結する必要があります。基本的にはこのような何か:javascriptの配列を連結して深くマージする

var x = { 
    name: 'abc', 
    family: { 
    children: [ 
     {name: 'xxx'}, 
     {name: 'zzz'} 
    ] 
    } 
}; 

var y = { 
    name: 'abc', 
    family: { 
    children: [ 
     {name: 'yyy'} 
    ] 
    } 
}; 

はどんな提案

var y = { 
    name: 'abc', 
    family: { 
     children: [ 
     {name: 'xxx'}, {name: 'zzz'}, {name: 'yyy'} 
     ] 
    } 
    }; 

になりますか?私はできるだけlodashベースのソリューションを好む。それは減速中なのでまた、私はちょうど新しいオブジェクトとプロパティを置き換えることはできません

+0

'x'と' y'オブジェクトが親レベルで異なる 'name'プロパティ値を持つ場合はどうなりますか? – RomanPerekhrest

+0

私の特定のケース名は、私が述べたようにソースオブジェクト –

答えて

0

オブジェクトは、それらのプロパティとして配列を持っていると私は彼らが は、連結の代わりに、あなたの簡単な例、それについて

を交換する必要があります

var x = {name: 'abc', family:{children:[{name: 'xxx'}, {name: 'zzz'} ] }}, y = {name: 'abc', family: {children: [{name: 'yyy'}]}}; 
 

 
y.family.children = y.family.children.concat(x.family.children); 
 
console.log(y);

Array.prototype.concat()機能を使用するのに十分だろう
+0

で置き換えることができます、私は減速機でこれを使用したので、私はyのプロパティを変更することはできません。私はそれをオブジェクト全体と置き換える必要があります。したがって、マージプロセス –

+0

@DanielW、なぜ* reducer *を投稿しないのですか? – RomanPerekhrest

0

すでにロダッシュを使用している場合は、mergeWithが必要な操作をしていないかどうかを確認してください(たとえば、this so answerを参照)。

とにかくここでは、あなたが望むようにすべき簡単な機能があります。チェックの点ではほとんど機能しないことに注意してください。オブジェクトが似ていると言っているので、最初のオブジェクトにあるプロパティだけをマージします。

また、オブジェクトを変更するのではなく、新しいオブジェクトを作成します。

function merge(a, b){ 
 
    var ret = {}; 
 
    for(prop in a){ 
 
    //assume b doesn't have properties that a hasn't 
 
    //only merge on similar types, else keep a 
 
    var propA = a[prop], 
 
     propB = b[prop]; 
 
    console.log(prop, typeof propA) 
 
    if((typeof propA == typeof propB) && (typeof propA == "object")){ 
 
     if(Array.isArray(propA)){ 
 
     ret[prop] = propA.concat(propB); 
 
     }else{ 
 
     ret[prop] = merge(propA, propB); 
 
     } 
 
    }else{ 
 
     ret[prop] = propA; 
 
    } 
 
    } 
 
    return ret; 
 
} 
 
var x = { 
 
    name: 'abc', 
 
    family: { 
 
    children: [ 
 
     {name: 'xxx'}, 
 
     {name: 'zzz'} 
 
    ] 
 
    } 
 
}; 
 

 
var y = { 
 
    name: 'abc', 
 
    family: { 
 
    children: [ 
 
     {name: 'yyy'} 
 
    ] 
 
    } 
 
}; 
 

 
console.log(merge(x, y)); 
 
console.log(merge(y, x));

0

私はあなたの目的の一つは、あなたがあなたの減速に変更したい状態であると仮定します。

return Object.assign({}, x, { 
    family: [...x.family, ...y.family] 
    }) 

まず、これはそれに新しい空のオブジェクトおよび譲受人のx(古い状態)を作成します:についてどう

。その後、新しいオブジェクトに上書きするファミリが割り当てられます。 ...は配列内のすべての要素を表しているため、配列を連結するために使用できます。

関連する問題