Нужна помощь с группировкой данных.
К примеру есть массив с данными
[{value: 25},{value: 25}, {value: 22}, {value: 25}]
подскажите что нужно сделать чтобы сгруппировать данные и получить на выходе такой массив ? + и еще который содержит groupCount: кол одинаковых обьектов
[{value: 25, groupCount: 3},{value: 22, groupCount: 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 }
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);
Правда, надо придумать что-то получше, чем
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));
Например так:
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); // смотрим на результат
Вот Вам еще такой вариант:
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);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Метод "TestMethod" выдает ошибку при выводе, "ObjArrayCityMapTestMethod is not a function", такая проблема, только при массиве объектов, не могу понять почему
Задача таковаЕсть функция, которая читает JSON файл, и выдаёт/возвращает его содержимое
Необходимо фильтровать массив arr1 по id, которые соответствует itemIds в массиве объектов arr2
Есть часть сайта для регистрации (человек в форме заполняет данные о количестве людей и часов):