Необходимо сгруппировать по множеству выбранных значений - PullRequest
0 голосов
/ 25 июня 2018

Это мой массив и мне нужно сгруппировать по отделу. Здесь dept массив, поэтому мне нужно сгруппировать его по значению dept.

myArray = [
{name: "one", dept: ["red", "blue"]},
{name: "two", dept: ["green", "blue"]}
]

Я пытался с этим кодом, но я не могу получить то, что мне нужно.

let deptObj = {};
_.map(myArray , el => {
  const mySubArray= [];
  _.filter(el.dept, (depts, i) => {            
     mySubArray.push(el.member);
     deptObj[depts] = mySubArray;
  })
}
});

Мне нужен такой результат, кто-нибудь может мне помочь?

deptObj={
red:[
    {name: "one", dept:["red", "blue"]}
],
blue:[
    {name: "one", dept:["red", "blue"]},
    {name: "two", dept:["green", "blue"]}
],
green:[
    {name: "two", dept:["green", "blue"]}
]
}

Ответы [ 3 ]

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

Вы можете использовать Array.reduce():

var arr = [
  {name: "one", dept: ["red", "blue"]},
  {name: "two", dept: ["green", "blue"]}
];

var result = arr.reduce((a,curr)=>{
    curr.dept.forEach((e)=>{ (a[e] = (a[e] || [])).push(curr)});
    return a;
},{});
console.log(JSON.parse(JSON.stringify(result)));
0 голосов
/ 17 августа 2018

Интересная проблема.Вот еще одно решение, которое является «одним вкладышем» и использует .reduce / .map / _. Concat:

const arr = [{name: "one", dept: ["red", "blue"]},{name: "two", dept: ["green", "blue"]}]

var result = arr.reduce((r, {dept}, i, a) => dept.map(x => r[x] = _.concat(r[x] || [], [a[i]])) && r, {})

console.log(result)
0 голосов
/ 25 июня 2018

Это решение делает то, что вам нужно:

let myArray = [
    { name: "one", dept: ["red", "blue"] },
    { name: "two", dept: ["green", "blue"] }
];
let deptObj = {};

myArray.forEach(item => {
    item.dept.forEach(dept => {
        if (!deptObj[dept]) {
            deptObj[dept] = [item];
        } else {
            deptObj[dept].push(item);
        }
    });
});

console.log(deptObj);
...