如果在对象中找到重复的名称,如何迭代对象数组以添加计数器值

问题描述 投票:-1回答:5

我有1个对象数组,想要迭代它中的对象。因此,如果找到重复的名称条目,我必须添加计数器值,它应该合并。最终的对象数组必须具有唯一的条目。

对象=

[
  {name: 'Voice', counter: 1},
  {name: 'tele', counter: 1},
  {name: 'equip', counter: 1},
  {name: 'equip', counter: 2},
  {name: 'Voice', counter: 1}
]

结果应该是: -

ObjectB =

[
  {name: 'Voice', counter: 2},
  {name: 'tele', counter: 1},
  {name: 'equip', counter: 3}
]
javascript underscore.js
5个回答
0
投票

你可以使用array.reduce和一些逻辑如下。

DEMO

let data = [{name: 'Voice', counter: 1},
           {name: 'tele', counter: 1},
           {name: 'equip', counter: 1},
           {name: 'equip', counter: 2},
           {name: 'Voice', counter: 1}]


var result = [];
data.reduce(function (res, value) {
    if (!res[value.name]) {
        res[value.name] = {        
        name: value.name,
        counter: 0
        };
        result.push(res[value.name])
    }
    res[value.name].counter += value.counter
    return res;
}, {});

console.log(result)

0
投票

您可以使用Map并将所有counter值相加,按name分组。

var data = [{ name: 'Voice', counter: 1 }, { name: 'tele', counter: 1 }, { name: 'equip', counter: 1 }, { name: 'equip', counter: 2 }, { name: 'Voice', counter: 1 }],
    unique = Array.from(
        data.reduce((m, { name, counter }) => m.set(name, (m.get(name) || 0) + counter), new Map),
        ([name, counter]) => ({ name, counter })
    );

console.log(unique);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0
投票

试试这种方法:

const arr = [
  {name: 'Voice', counter: 1},
  {name: 'tele', counter: 1},
  {name: 'equip', counter: 1},
  {name: 'equip', counter: 2},
  {name: 'Voice', counter: 1}
];

const resultObj = arr.reduce((acc, item) => {
  acc[item.name] = (acc[item.name] || 0) + item.counter;
  return acc;
}, {})

const resultArr = Object.entries(resultObj).map(entry => ({
  name: entry[0],
  counter: entry[1]
}))

document.body.innerHTML = `<pre>${JSON.stringify(resultArr, null, 2)}</pre>`

0
投票

您可以使用reduce从列表中对具有相同name的对象进行分组。稍后如果找到具有相同名称的对象,则增加counter,否则将对象推入阵列。

var arr = [{name: 'Voice', counter: 1},
           {name: 'tele', counter: 1},
           {name: 'equip', counter: 1},
           {name: 'equip', counter: 2},
           {name: 'Voice', counter: 1}];

var newArray = arr.reduce((acc, item)=>{
var element = acc.find(obj => obj['name'] === item['name']);
if(element){
   element['counter'] = element['counter'] + 1;
 }else{
  acc.push(item);
 }
return acc;
}, []);

console.log(newArray);

0
投票

你可以使用lodash reduce功能

    let data = [{name: 'Voice', counter: 1},
               {name: 'tele', counter: 1},
               {name: 'equip', counter: 1},
               {name: 'equip', counter: 2},
               {name: 'Voice', counter: 1}];
    
    data = _.reduce(data, (arr, n)=> {
        const index = _.findIndex(arr,{name: n.name});
        if(index !== -1){
          arr[index].counter += 1; 
        } else {
          arr.push(n);
        }
        return arr;
        },[]);
      
      console.log(data);
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>
© www.soinside.com 2019 - 2024. All rights reserved.