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

时间:2014-12-17 11:12:05

标签: javascript jquery arrays object merge

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

我的数组看起来像这样:

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"合并和分隔。

我认为以下内容可行:

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的eveything,如果它有命中,则将其与一个逗号。

FIDDLE

1 个答案:

答案 0 :(得分:1)

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

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