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

У меня есть массив userList:

[
  {email : 'abc@gmail.com',
  department : 'd1'},
  {email : 'abc@gmail.com',
  department : 'd2'},
  {email : 'dec@gmail.com',
  department : 'd1'},
]

Я хотел, чтобы он был таким:

[
  {
  email : 'abc@gmail.com',
  department : ['d1','d2']
  },
  {
  email : 'dec@gmail.com',
  department : ['d1']
  }
]

Я добился этого используя:

const userGrp = _.groupBy(userList, 'email');
let data = [];
for (let key in userGrp) {
    if (userGrp.hasOwnProperty(key)) {
        const obj = {
            email: key,
            dept: extractDept(userGrp[key]),
        };
        data.push(obj);
    }
}

function extractDept(userObjList) {
  const arr = [];
  userObjList.forEach((element) => {
    arr.push(element.departmentName);
  });
  return arr;
}

Как я могу добиться этого, используя lodash?

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Вот рабочий пример с Lodash: http://jsfiddle.net/houssein/u4dzLk2b/1/

   var data = [
      {email : 'abc@gmail.com',
      department : 'd1'},
      {email : 'abc@gmail.com',
      department : 'd2'},
      {email : 'dec@gmail.com',
      department : 'd1'},
    ];

    var result = _.chain(data)
        .groupBy("email")
        .pairs()
        .map(function (currentItem) {
            return _.object(_.zip(["email", "departement"], currentItem));
        })
        .value();
    console.log(result);
0 голосов
/ 19 ноября 2018

С группировкой Lodash на email и использованием записей и «отображением» для получения требуемого результата:

const data = [{ email: 'abc@gmail.com', department: 'd1' }, { email: 'abc@gmail.com', department: 'd2' }, { email: 'dec@gmail.com', department: 'd1' }, ]

const result = _(data)
  .groupBy('email')
  .entries()
  .map(([k,v]) => ({email: k, departments: _.map(v, 'department')}))
  .value()

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

С ES6:

const data = [{ email: 'abc@gmail.com', department: 'd1' }, { email: 'abc@gmail.com', department: 'd2' }, { email: 'dec@gmail.com', department: 'd1' }, ]

const grp = data.reduce((r,c) => (r[c.email] = [...r[c.email] || [], c], r), {})
console.log(Object.entries(grp).map(([k,v]) => 
   ({email: k, departments: v.map(x => x.department)})))
0 голосов
/ 19 ноября 2018

Поскольку использовать простой js довольно просто, вот простой способ js сгруппировать, как вам нравится

const grouped = [...foo.reduce((a, {email, department}) =>
     a.set(email, (a.get(email) || []).concat(department))
, new Map)].map(([email, department]) => ({email, department}));

console.log(grouped)
<script>
const foo = [
    {email : 'abc@gmail.com',
        department : 'd1'},
    {email : 'abc@gmail.com',
        department : 'd2'},
    {email : 'dec@gmail.com',
        department : 'd1'},
];

</script>
...