Как сгруппировать одинаковые данные?

107
07 марта 2022, 22:00

Нужна помощь с группировкой данных.

К примеру есть массив с данными

[{value: 25},{value: 25}, {value: 22}, {value: 25}]

подскажите что нужно сделать чтобы сгруппировать данные и получить на выходе такой массив ? + и еще который содержит groupCount: кол одинаковых обьектов

[{value: 25, groupCount: 3},{value: 22, groupCount: 1}]

Answer 1

var arr = [{value: 25}, {value: 25}, {value: 22}, {value: 25}] 
 
var map = Object.create(null) 
for (var x of arr) (map[x.value] = map[x.value] || []).push(x) 
console.log(map) 
 
var res = [] 
for (var k of Object.keys(map)) res.push({ value: +k, count: map[k].length }) 
console.log(res)
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

var arr = [{value: 25}, {value: 25}, {value: 22}, {value: 25}] 
 
var map = Object.create(null) 
for (var x of arr) map[x.value] = ~~map[x.value] + 1 
console.log(map) 
 
var res = [] 
for (var k of Object.keys(map)) res.push({ value: +k, count: map[k] }) 
console.log(res)
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

Answer 2

const group = data => { 
  const counts = data.reduce( 
    (rslt, { value }) => rslt.set(value, ~~rslt.get(value) + 1) 
  , new Map());  
  return [...counts.entries()].map( 
    ([value, groupCount]) => ({ value, groupCount }) 
  );  
};  
 
// test 
const result = group([{value: 25}, {value: 25}, {value: 22}, {value: 25}]);  
console.log(result); 

Answer 3

Правда, надо придумать что-то получше, чем

return [...Object.entries(obj).sort()].join();

const arr = [{value: 25}, {value: 25}, {value: 22}, {value: 25}, {value: 22}]; 
 
function check(obj) { 
  return [...Object.entries(obj).sort()].join(); 
} 
 
function reducer(curr, prev) { 
  if (curr[check(prev)]) { 
    curr[check(prev)].groupCount++ 
  } else { 
    curr[check(prev)] = {groupCount: 1, ...prev}; 
  } 
  return curr; 
} 
 
const counter = arr.reduce(reducer, {}); 
console.log(Object.values(counter));

Answer 4

Например так:

var values = [{value: 25},{value: 25}, {value: 22}, {value: 25}]; // формируем массив объектов 
 
function filterItems(query) { // пишем функцию для работы с массивом 
let newArray = []; // создаем array для возврата 
query.forEach(function(each) { // для каждого объекта изначального массива делаем проверку 
if(newArray.some(r => r.value == each.value) == false){ // проверяем есть ли объект в массиве для возврата 
   let tmp = query.filter(item => item.value == each.value); // собираем массив из элементов с одинаковым значением value 
   let topush = {}; // создаем объект для помещения в array для возврата. 
   topush.value = each.value; // записываем value 
   topush.groupCount = tmp.length; // записываем количество повторений 
   newArray.push(topush); // помещаем объект в array для возврата 
} 
});  
return newArray; // возвращаем готовый array 
} 
var result = filterItems(values); // отдаем функции массив для работы и помещаем результат в переменную result 
console.log(result); // смотрим на результат

Answer 5

Вот Вам еще такой вариант:

let arr = [{value: 25}, {value: 25}, {value: 22}, {value: 25}]; 
 
let all = arr.map(el => el.value); 
let count = v => all.filter(i => i === v).length; 
let uniq = [...new Set(all)];  
let res = uniq.map(v => ({value: v, groupCount: count(v)})); 
 
console.log(res);

READ ALSO
метод is not a function, когда массив объектов

метод is not a function, когда массив объектов

Метод "TestMethod" выдает ошибку при выводе, "ObjArrayCityMapTestMethod is not a function", такая проблема, только при массиве объектов, не могу понять почему

82
Получение данных из JSON в js

Получение данных из JSON в js

Задача таковаЕсть функция, которая читает JSON файл, и выдаёт/возвращает его содержимое

159
Фильтрация массива объектов

Фильтрация массива объектов

Необходимо фильтровать массив arr1 по id, которые соответствует itemIds в массиве объектов arr2

98
Тип данных в JS

Тип данных в JS

Есть часть сайта для регистрации (человек в форме заполняет данные о количестве людей и часов):

141