2017-11-30 17 views
1

私はオブジェクトの配列を持っています。同じキーを持つ配列のすべてのオブジェクトを結合する必要があります。同じキーを持つオブジェクトをlodashで結合する

これは、元の配列である:

[ 
    { 
     foo: "A", 
     bar: [ 
      { baz: "1", qux: "a" }, 
      { baz: "2", qux: "b" } 
     ] 
    }, 
    { 
     foo: "B", 
     bar: [ 
      { baz: "3", qux: "c" }, 
      { baz: "4", qux: "d" } 
     ] 
    }, 
    { 
     foo: "A", 
     bar: [ 
      { baz: "5", qux: "e" }, 
      { baz: "6", qux: "f" } 
     ] 
    }, 
    { 
     foo: "B", 
     bar: [ 
      { baz: "7", qux: "g" }, 
      { baz: "8", qux: "h" } 
     ] 
    } 
] 

私は次のように出力されているので、オブジェクトを結合する必要があります。

[ 
    { 
     foo: "A", 
     bar: [ 
      { baz: "1", qux: "a" }, 
      { baz: "2", qux: "b" }, 
      { baz: "5", qux: "e" }, 
      { baz: "6", qux: "f" } 
     ] 
    }, 
    { 
     foo: "B", 
     bar: [ 
      { baz: "3", qux: "c" }, 
      { baz: "4", qux: "d" }, 
      { baz: "7", qux: "g" }, 
      { baz: "8", qux: "h" } 
     ] 
    } 
] 

どのように私はlodashまたはJavaScriptでこれを達成することができますか?

+0

あなたのオブジェクトの構造が間違っています。 –

答えて

3

ハッシュテーブルを使用してデータをフィルタリングして更新できます。

この提案は元のデータセットを変更します。その後、

var array = [{ foo: "A", bar: [{ baz: "1", qux: "a" }, { baz: "2", qux: "b" }] }, { foo: "B", bar: [{ baz: "3", qux: "c" }, { baz: "4", qux: "d" }] }, { foo: "A", bar: [{ baz: "5", qux: "e" }, { baz: "6", qux: "f" }] }, { foo: "B", bar: [{ baz: "7", qux: "g" }, { baz: "8", qux: "h" }] }], 
 
    hash = Object.create(null), 
 
    result = array.filter(function (o) { 
 
     if (!hash[o.foo]) { 
 
      hash[o.foo] = o.bar; 
 
      return true; 
 
     } 
 
     Array.prototype.push.apply(hash[o.foo], o.bar); 
 
    }); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

使用_.groupBy()、および単一のオブジェクトに各グループを組み合わせること_.mergeWith()を使用します。

const data = [{"foo":"A","bar":[{"baz":"1","qux":"a"},{"baz":"2","qux":"b"}]},{"foo":"B","bar":[{"baz":"3","qux":"c"},{"baz":"4","qux":"d"}]},{"foo":"A","bar":[{"baz":"5","qux":"e"},{"baz":"6","qux":"f"}]},{"foo":"B","bar":[{"baz":"7","qux":"g"},{"baz":"8","qux":"h"}]}]; 
 

 
const result = _(data) 
 
    .groupBy('foo') 
 
    .map((g) => _.mergeWith({}, ...g, (obj, src) => 
 
     _.isArray(obj) ? obj.concat(src) : undefined)) 
 
    .value(); 
 
    
 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

関連する問題