Как посчитать повторяющийся объект в JS - PullRequest
3 голосов
/ 17 июня 2020

Я пытаюсь добавить счетный номер для дубликата в 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}
]

Ответы [ 4 ]

2 голосов
/ 17 июня 2020

использовать .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 голос
/ 17 июня 2020

Один из способов сделать это - создать карту со значениями x и y и соответственно увеличить счетчик, а затем преобразовать карту в массив:

    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.net/9o35neg7/

0 голосов
/ 17 июня 2020

Используйте forEach и создайте объект с ключом (состоящим из x, y) и значениями (совокупное количество). Получите 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))
0 голосов
/ 17 июня 2020

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...