2017-03-07 13 views
3

複製:Lodashは、私は二つの配列を持つ

私はPARENTID ===援助に基づいて、これらの配列をマージしたい
var a = [ 
    {aId: 1, name: "a1"}, 
    {aId: 2, name: "a2"} 
]; 
var b = [ 
    {parentId: 1, description: "b1"}, 
    {parentId: 1, description: "b2"}, 
    {parentId: 2, description: "b3"} 
]; 

私がやった:

var c = _.map(a, function(obj) { 
    return _.assign(obj, _.find(b, {parentId: obj.aId})); 
}) 

JSfiddle

予想通りこれは動作しますが、私はそれが重複を処理する必要がある - これは一致を検出するとき、それは正しく、それをマージしますが、私の代わりにプッシュし、それを必要としますマージの代わりに新しいプロパティにマージします。

は、私が何を得る:

[ 
    {aId: 1, name: "a1", description: "b1"}, 
    {aId: 2, name: "a2", description: "b3"} 
] 

は、私が欲しいもの:

[ 
    { 
     aId: 1, 
     name: "a1", 
     b: [ 
      {parentId: 1, description: "b1"}, 
      {parentId: 1, description: "b2"} 
     ] 
    }, 
    { 
     aId: 2, 
     name: "a2", 
     b: [ 
      {parentId: 2, description: "b1"} 
     ] 
    } 
] 

共通プロパティはもちろん、省略することができます。

+0

あなたは配列に一致するすべての結果を取得し、それに応じてマッピングを更新するように代わり_.find' 'の_.filter''使用します。 – Shilly

+0

ありがとう、そのトリックをした – Zoidy

答えて

2

コードはほぼ完了しています。 _.find()は未定義の他に、マッチした要素を返し、_.filter()は新しいフィルター配列を返すこと

{ 
    b: _.filter(b, {parentId: obj.aId}) 
} 

注:_.assign()あなたの代わりに_.find()_.filter()の結果に等しいプロパティbでオブジェクトを渡すことができますインチ

コード:

var a = [{aId: 1, name: "a1"}, {aId: 2, name: "a2"}], 
 
    b = [{parentId: 1, description: "b1"}, {parentId: 1, description: "b2"}, {parentId: 2, description: "b3"}]; 
 

 
_.map(a, function(obj) { 
 
    return _.assign(obj, { 
 
    b: _.filter(b, {parentId: obj.aId}) 
 
    }); 
 
}); 
 

 
console.log(a);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+0

_Mapは、元の配列を変更したようだ、cの必要はありません – Zoidy

関連する問題