2016-10-01 3 views
0

pushspliceなどを使ってみると成功しませんでした。私はそれを動作させるための手がかり(または2つ)を私に与えることができることを願っています。共通キーに基づいて2つのオブジェクトを結合/結合する(プッシュ?スプライス?)

オブジェクト#1:

houses:  [ { _id: 1, 
       KLLS: '72797-194155', 
       date : '01/01/1984'}, 

       { _id: 2, 
       KLLS: '84773-949399', 
       date : '01/01/1984'} 
      ] 

オブジェクト#2:

懸命にいないようです... :(

は、私は2つのオブジェクトを持っている私の問題は、以下の

works:  [ { _id: 27, 
       KLLS: '72797-194155', 
       stuff : 'some stuff'}, 

       { _id: 28, 
       KLLS: '72797-194155', // Note that KLLS key is the same as id:27 
       stuff : 'some stuff'}, 

       { _id: 29, 
       KLLS: '84773-949399', 
       stuff : 'some stuff'}, 

       { _id: 30, 
       KLLS: '84773-949399', // Note that KLLS key is the same as id:29 
       stuff : 'some stuff'}, 

] 

私が達成したいことは次のようなものです:

[ { _id: 1, 
    KLLS: '72797-194155', 
    date : '01/01/1984', 
    stuff: 
     [ { _id: 27, 
      KLLS: '72797-194155', 
      stuff : 'some stuff'}, 

      { _id: 28, 
      KLLS: '72797-194155', 
      stuff : 'some stuff'} 
     ] 
    }, 

    { _id: 2, 
    KLLS: '84773-949399', 
    date : '01/01/1984', 
    stuff: 
     [ { _id: 27, 
      KLLS: '72797-194155', 
      stuff : 'some stuff'}, 

      { _id: 28, 
      KLLS: '72797-194155', 
      stuff : 'some stuff'} 
     ]} 
] 

実は私はこの時点で(Lodash使用して)います:

for(var i = 0; i < houses.length; i++) { 

     // get the KLLS key for each house[i] 
     var klls = houses[i].KLLS 

    // retrieve the works corresponding to KLLS key for house[i] 
    var trvx = _.filter(works, ['KLLS', klls]) 

    // Merge the two to get the wanted output... 
    --> Whatever I try here, nothing works... 
     even using splice or push... 

} 

あなたがトラックに私を取得する任意の手掛かりを持っていますか?

答えて

0

あなたがこれを行うことができます...

var a = [{ 
 
    _id: 1, 
 
    KLLS: '72797-194155', 
 
    date: '01/01/1984' 
 
    }, 
 

 
    { 
 
    _id: 2, 
 
    KLLS: '84773-949399', 
 
    date: '01/01/1984' 
 
    } 
 
] 
 
var b = [{ 
 
    _id: 27, 
 
    KLLS: '72797-194155', 
 
    stuff: 'some stuff' 
 
    }, 
 

 
    { 
 
    _id: 28, 
 
    KLLS: '72797-194155', // Note that KLLS key is the same as id:27 
 
    stuff: 'some stuff' 
 
    }, 
 

 
    { 
 
    _id: 29, 
 
    KLLS: '84773-949399', 
 
    stuff: 'some stuff' 
 
    }, 
 

 
    { 
 
    _id: 30, 
 
    KLLS: '84773-949399', // Note that KLLS key is the same as id:29 
 
    stuff: 'some stuff' 
 
    }, 
 

 
] 
 
var newobj = [] 
 

 
var n = a.map(function(el) { 
 
    var temp = [] 
 
    b.map(function(el2) { 
 
    if (el.KLLS === el2.KLLS) { 
 
     temp.push(el2) 
 
    } 
 
    }) 
 
    el.stuffs = temp 
 
    newobj.push(el) 
 
}) 
 

 
console.log(newobj)

+0

こんにちは、それ**ほとんど**仕事:-)。実際にコードでは、b._id:27 **および** b._id:28のアイテムをa._id:1にプッシュする必要があります(完全な例については私の元のメッセージを参照してください)。あなたのコードスニペットはb._id:28 ...のみを挿入するのに対し、これを修正する方法はありますか?再度、感謝します。 – nerotulip

+0

@nerotulip更新されました!答えを受け入れることを検討してください。 –

0

それは同情解決策に到達するためにその便利な方法のいずれかを使用してlodashを有するないことと思います。

次のようにの家 'とラベルされたworks JSONとしてラベルhouses JSONは「働く」は、あなたがあなたのソリューションを得るために行うことができます:

var res = _.reduce(houses, function (memo, house) { 
    return memo.concat(_.extend({}, house, { 
     stuff: _.filter(works, {KLLS :house.KLLS}) 
    })); 
}, []); 

console.log(res); 

アイデアはreduceに新規にhouses配列です家屋の配列extendedが行われた作品。

可能な限り機能がpureになるように、オリジナルを変更する代わりに新しいオブジェクトを作成することをお勧めしました。

0
アレイ連結方式

、KLLSによってグループ化をし、必要なオブジェクトを生成するために、各グループの配列を低減:

function combine(arr1, arr2) { 
 
    return _(arr1) 
 
    .concat(arr2) // concat the 2nd array 
 
    .groupBy('KLLS') // group the items by KLLS 
 
    .map(function(group) { 
 
     return group.reduce(function(result, obj) { 
 
     if (obj.date) { // if it's an object with date, merge it with current result and return 
 
      return _.merge(result, obj); 
 
     } 
 

 
     result.stuff.push(obj); 
 
     return result; 
 
     }, { stuff: [] }); // initial value is an object with stuff array 
 
    }) 
 
    .value(); // end the chain 
 
} 
 

 
var houses = [{ 
 
    _id: 1, 
 
    KLLS: '72797-194155', 
 
    date: '01/01/1984' 
 
}, { 
 
    _id: 2, 
 
    KLLS: '84773-949399', 
 
    date: '01/01/1984' 
 
}]; 
 

 
var works = [{ 
 
    _id: 27, 
 
    KLLS: '72797-194155', 
 
    stuff: 'some stuff' 
 
    }, 
 

 
    { 
 
    _id: 28, 
 
    KLLS: '72797-194155', 
 
    stuff: 'some stuff' 
 
    }, 
 

 
    { 
 
    _id: 29, 
 
    KLLS: '84773-949399', 
 
    stuff: 'some stuff' 
 
    }, 
 

 
    { 
 
    _id: 30, 
 
    KLLS: '84773-949399', 
 
    stuff: 'some stuff' 
 
    }, 
 
]; 
 

 
var result = combine(houses, works); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.2/lodash.min.js"></script>

関連する問題