группировать массив объектов по нескольким параметрам

1

Я пытаюсь сгруппировать массив объектов, передав ключ, который я хочу сгруппировать по параметру в функцию, которую я написал, например, если у меня есть этот массив из трех объектов:

[{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)}

Я представляю ключ результата как массив для удобства, не уверен, что это правильный способ сделать это. любая идея, как я могу это достичь? Спасибо

Теги:
ecmascript-6

2 ответа

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; }
1

Вы можете сделать что-то вроде:

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);
  • 0
    Спасибо, также отличное решение, которое показывает передачу второго параметра в виде массива

Ещё вопросы

Сообщество Overcoder
Наверх
Меню