基于子值合并数组中的对象

我有一个填充了对象的数组。 当具有匹配的特定子值时,如何合并此数组中的对象?

我的数组看起来像这样:

var data = [ { prod_name:"test1", type:"1", color:"white", product_id:"5" }, { prod_name:"test2", type:"1", color:"green", product_id:"7" }, { prod_name:"test2", type:"2", color:"green", product_id:"7" }, { prod_name:"test3", type:"4", color:"red", product_id:"8" }, { prod_name:"test4", type:"2", color:"white", product_id:"21" } ]; 

我想基于匹配的product_id合并对象。

如果值不相同,我想保留BOTH值,用逗号分隔。 所以前一个数组的结果将成为:

 [ { prod_name:"test1", type:"1", color:"white", product_id:"5" }, { prod_name:"test2", type:"1,2", color:"green", product_id:"7" }, { prod_name:"test3", type:"4", color:"red", product_id:"8" }, { prod_name:"test4", type:"2", color:"white", product_id:"21" } ]; 

数组缩小为1,因为它有一个重复,并且两个不相同的值被逗号type:"1,2"合并和分隔type:"1,2"

我认为以下内容可行:

 jQuery.each( data, function( i, val ) { var productID = val.product_id; var index_key = i; jQuery.each( data, function( i, val ) { if(val.product_id == productID && data[index_key] != data[i]){ jQuery.extend(data[index_key], data[i]); } }); }); 

但这只会覆盖第一个匹配的type值并保留两个条目。

对于“mergable”项,值prod_nameproduct_id始终相同。

有谁知道达到预期结果的方法?

更新:可能在稍后阶段添加不同的值(产品属性)。 因此,我更喜欢一种不专门检查type属性的方法,而是检查不是product_idprod_name ,如果有命中,则将其与逗号合并。

小提琴

我在示例中做了什么。首先,我创建对象以实现唯一值(通过project_id ),然后将对象转换为数组。 在第一个循环中,我检查res -put中是否存在item,否则我只更改属性类型

 var res = {}; $.each(data, function (key, value) { if (!res[value.product_id]) { res[value.product_id] = value; } else { res[value.product_id].type = [ res[value.product_id].type, value.type ].join(','); } }); data = $.map(res, function (value) { return value; }); console.log(data); 

Example