【问题标题】:Javascript merge objects in a array [duplicate]Javascript合并数组中的对象[重复]
【发布时间】:2020-09-20 13:48:14
【问题描述】:

如何修改对象数组以合并重复名称。考虑这个例子

const arr1 = [
   {name: "HTML", count: 4},
   {name: "CSS", count: 5}, 
   {name: "JS", count: 10}, 
   {name: "CSS", count: 11},
   {name: "PHP", count: 12},
   {name: "HTML", count: 4},
   {name: "CSS", count: 14},
   {name: "JS", count: 7}]

我的结果数组应该是

const result = [
   {name: "HTML", count: 8},
   {name: "CSS", count: 30}, 
   {name: "JS", count: 17}, 
   {name: "PHP", count: 12}]

在这种情况下,为具有相同 name 的对象添加 count 属性。

谁能告诉我如何做到这一点
(我也想对代码进行解释,因为我对使用高阶函数有点陌生) 任何帮助表示赞赏,谢谢

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您可以结合使用reduceObject.entriesmap

    方法:用名称和总数的键值对创建一个查找对象,使用reduce计算这个对象。然后使用Object.entries将对象转换为键值对数组,map通过每个键值对返回相关对象

    const arr1 = [
      { name: "HTML", count: 4 },
      { name: "CSS", count: 5 },
      { name: "JS", count: 10 },
      { name: "CSS", count: 11 },
      { name: "PHP", count: 12 },
      { name: "HTML", count: 4 },
      { name: "CSS", count: 14 },
      { name: "JS", count: 7 },
    ]
    
    const res = Object.entries(
      arr1.reduce(
        (acc, el) => ({ ...acc, [el.name]: (acc[el.name] || 0) + el.count }),
        {}
      )
    ).map(([name, count]) => ({ name, count }))
    
    console.log(res)
    .as-console-wrapper { max-height: 100% !important; }

    【讨论】:

      【解决方案2】:

      这将给出预期的结果:

      resultArr = [];
      for(let arrObj of arr1) {
          var index = resultArr.findIndex(resultObj => resultObj.name == arrObj.name)
          if(index == -1) {
              resultArr.push(arrObj);
          }
          else {
              resultArr[index].count += arrObj.count;
          }
      }
      

      【讨论】:

        【解决方案3】:

        您可以使用Arary.prototype.reduce 合并具有相同键的对象,创建name 作为键和count 作为值的映射。

        如果名称存在于映射中,则添加计数,否则插入一个新条目,然后使用Object.keysArray.prototype.map 映射到{name: <name>, count: <count>} 形式的对象数组:

        const arr1 = [{name: "HTML", count: 4}, {name: "CSS", count: 5},{name: "JS", count: 10}, {name: "CSS", count: 11}, {name: "PHP", count: 12}, {name: "HTML", count: 4}, {name: "CSS", count: 14}, {name: "JS", count: 7}];
           
        const merged = arr1.reduce((acc, {name, count}) => {
          return {...acc, [name]: (acc[name] ?? 0) + count } ;
        }, {})
        
        const arr = Object.keys(merged)
          .map(key => ({
            name: key,
            count: merged[key]
          }));
        
        console.log(arr);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-29
          • 1970-01-01
          • 2019-07-15
          • 1970-01-01
          • 1970-01-01
          • 2016-10-03
          • 2018-10-14
          • 2021-02-09
          相关资源
          最近更新 更多