Я пытаюсь сгруппировать массив объектов, передав ключ, который я хочу сгруппировать по параметру в функцию, которую я написал, например, если у меня есть этот массив из трех объектов:
[{date: "2018-01-01", website: "example.com", revenue: 100},
{date: "2018-01-01", website: "example2.com", revenue:200},
{date: "2018-01-02", website: "example.com", revenue: 300}]
и я передам их своей функции:
groupArr(arr, prop) {
return arr.reduce(function (groups, item) {
const val = item[prop];
groups[val] = groups[val] || [];
groups[val].push(item);
return groups
}, {})
}
результатом будет: {2018-01-01: Array(2), 2018-01-02: Array(1)}
но теперь я пытаюсь выяснить, как я могу изменить эту функцию так, чтобы я мог передавать два параметра, например дату и сайт: groupArr(arr,["date","website"]
чтобы мой результат включал группы по двум параметрам, что в моем случае будет следующим:
{{[2018-01-01,"example.com"]: Array(1),[2018-01-01,"example2.com"]: Array(1), 2018-01-02: Array(1)}
Я представляю ключ результата как массив для удобства, не уверен, что это правильный способ сделать это. любая идея, как я могу это достичь? Спасибо
Вы можете создать новый ключ, состоящий из значений требуемых свойств.
function groupArr(arr, ...props) {
return arr.reduce(function (groups, item) {
const key = props.map(k => item[k]).join('|');
groups[key] = groups[key] || [];
groups[key].push(item);
return groups;
}, {});
}
var array = [{ date: "2018-01-01", website: "example.com", revenue: 100 }, {date: "2018-01-01", website: "example2.com", revenue: 200 }, { date: "2018-01-02", website: "example.com", revenue: 300 }, { date: "2018-01-01", website: "example.com", revenue: 340 }];
grouped = groupArr(array, "date", "website");
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Вы можете сделать что-то вроде:
let arr = [{date: "2018-01-01",website: "example.com",revenue: 100},{date: "2018-01-01",website: "example2.com",revenue: 200},{date: "2018-01-02",website: "example.com",revenue: 300}];
function groupArr(arr, prop) {
prop = Array.isArray(prop) ? prop : [prop]; //Make sure that prop is an array. Convert to array if not
return arr.reduce(function(groups, item) {
const val = prop.map(o => item[o]).join('-'); //Map and Concat all values of prop and use as key
groups[val] = groups[val] || [];
groups[val].push(item);
return groups
}, {})
}
//Will work if prop is array
let result = groupArr(arr, ["date", "website"]);
console.log(result);
//Will work if string
let result2 = groupArr(arr, "date");
console.log(result2);