2016-05-14 8 views
0

レコードが少なく、配列にマージしたい。ここではいくつかのサンプルデータは、次のとおりです。配列の重複するエントリをマージする方法

var data = [{ 
    name:'book1', 
    category: "nurse", 
    location: "US edition" 
}, 
{ 
    name:'book2', 
    category: "nurse", 
    location: "US edition" 
}, 
{ 
    name:'book3', 
    category: "patient", 
    location: "CAN edition" 
}] 

私の考え最終結果がどうあるべきかのよう:私は、しかし、私は見つけることができません、とマージ、レコードを結合しようとした

var data = [{ 
    [name:'book1',name:'book2'], 
    category: "nurse", 
    location: "US edition" 
}, 
{ 
    name:'book3', 
    category: "patient", 
    location: "CAN edition" 
}] 

名前。これまでに書いたコードは次のとおりです。

var data = [ 
    { 
     name:'book1', 
     category: "nurse", 
     location: "US edition" 
    }, 
    { 
     name:'book2', 
     category: "nurse", 
     location: "US edition" 
    }, 
    { 
     name:'book3', 
     category: "patient", 
     location: "CAN edition" 
    } 
], 
i = 0, 
j = data.length - 1, 
current; 

for (;i < data.length; i++) { 
    current = data[i]; 
    for (;j > i; j--) { 
     if (current.asset === data[j].asset && current.location === data[j].location) { 
      if (Array.isArray(current.data)) { 
       current.data = current.data.concat([data[j].data]); 
      } else { 
       current.data = [].concat([data[j].data, current.data]); 
      } 
      data.splice(j, 1); 
     } 
    } 
} 

console.log(data); 

私のデータを配列にマージする方法はありますか?

+0

あなたがグループにそれらをしたいかによって異なります。 'category'でグループ化すると、' name'は配列になります。 'name:['book1'、 'book2']' –

答えて

2

Array.prototype.reduce()は、これらのジョブに最適です。

var data = [ 
 
{name:'book1', 
 
    category: "nurse", 
 
    location: "US edition" 
 
}, 
 
{ 
 
    name:'book2', 
 
    category: "nurse", 
 
    location: "US edition" 
 
}, 
 
{ name:'book3', 
 
    category: "patient", 
 
    location: "CAN edition" 
 
} 
 
], 
 
reduced = data.reduce((p,c) => {var f = p.find(e => e.category == c.category && e.location == c.location); 
 
           !!f ? f.name.push(c.name) 
 
            : p.push({name:[c.name], category: c.category, location: c.location}); 
 
           return p;},[]); 
 

 
document.write("<pre>" + JSON.stringify(reduced,null,2) + "</pre>");

+1

reduce solutionがうまくいっています。三項論理を '!! f? 'に変更できます。 (Array.isArray(f.name)?f.name.push(c.name):f.name = [f.name、c.name]):p.push({name:c.name、category:c .category、location:c.location}); 'これは、一意のカテゴリ/位置の組み合わせに大括弧を追加しません。 – timolawl

+1

@timolawlこれは私が探していたものです..ありがとう –

関連する問題