JS中如何计算重复对象

问题描述 投票:3回答:2

我试图在JS中为重复的对象添加计数,我在下面这个案例中完全是堆栈,我需要比较两个值(x,y)的对象,如果有相同的值(x,y)在新对象上添加计数1。

有什么方法可以将数据转换为newData,如下面的情况?

const data = [
    {id: 1, x: 1, y: 1},
    {id: 2, x: 2, y: 2},
    {id: 3, x: 1, y: 1},
]

const newData = [
    {x: 1, y:1 ,count:2}
    {x: 2, y:2 ,count:1}
]
javascript arrays duplicates
2个回答
2
投票

使用 .reduce() 功能

const data = [
    {id: 1, x: 1, y: 1},
    {id: 2, x: 2, y: 2},
    {id: 3, x: 1, y: 1},
]

const output = data.reduce((acc, curr) => {
  curr.count = 1;
  const exists = acc.find(o => o.x === curr.x && o.y === curr.y);
  
  exists ? exists.count++ : acc.push(({ x, y, count } = curr));
  
  return acc;
}, []);

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

1
投票

其中一种方法是,在地图上用 xy 值,并据此递增计数,然后将映射转换为数组。

    const data = [
        {id: 1, x: 1, y: 1},
        {id: 2, x: 2, y: 2},
        {id: 3, x: 1, y: 1},
    ]
    
    const makeXYMap =  (data) => data.reduce((acc, cur) => {
      const { x, y } = cur;
      const entry = acc[`${x}_${y}`];
      
      if (entry) {
    	acc[`${x}_${y}`] = {...entry, count: entry.count + 1};
      } else {
      	acc[`${x}_${y}`] = { x, y, count: 1 };
      }
    
      return acc;
    }, {});
    
    const makeArray = (XYMap) => Object.values(XYMap);
    
    console.log(makeArray(makeXYMap(data)));

需要注意的是,从复杂程度上来说,这个解决方案是一个... O(N).

https:/jsfiddle.net9o35neg7。


0
投票

const data = [
  { id: 1, x: 1, y: 1 },
  { id: 2, x: 2, y: 2 },
  { id: 3, x: 1, y: 1 },
  // .. so on ..
];

const countedData = data.reduce((acc, { x, y }, index, array) => {
  acc[`x${x}y${y}`] = {
    x,
    y,
    count: (acc[`x${x}y${y}`] ? acc[`x${x}y${y}`].count : 0) + 1
  };

  return index === (array.length - 1) ? Object.values(acc) : acc;
}, {});

console.log(countedData);

0
投票

使用 forEach 并建立一个有key(由x,y组成)和value(集合数)的对象。获取 Object.values 以数组形式获取结果。

const data = [
    {id: 1, x: 1, y: 1},
    {id: 2, x: 2, y: 2},
    {id: 3, x: 1, y: 1},
]

const counts = (arr, res = {}) => {
  arr.forEach(({x , y}) => 
    res[`${x}-${y}`] = { x, y, count: (res[`${x}-${y}`]?.count ?? 0) + 1 })
  return Object.values(res);
}

console.log(counts(data))
© www.soinside.com 2019 - 2024. All rights reserved.