【问题标题】:Merging objects in array based on sub-value基于子值合并数组中的对象
【发布时间】:2015-02-15 22:11:22
【问题描述】:

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

我的数组如下所示:

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 合并对象。

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

[
    {
        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 值并保留两个条目。

对于“可合并”项目,prod_nameproduct_id 的值始终相同。

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

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

FIDDLE

【问题讨论】:

    标签: javascript jquery arrays object merge


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2022-12-18
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 2018-04-01
      • 2021-01-27
      • 2019-03-26
      • 1970-01-01
      相关资源
      最近更新 更多