группировать массив объектов по нескольким параметрам - PullRequest
0 голосов
/ 13 июня 2018

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

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

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

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

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

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 голосов
/ 13 июня 2018

Вы можете создать новый ключ из значений требуемых свойств.

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