Loda sh или Javascript - группа по имени, затем равными строками - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть loda sh, чтобы сгруппировать мой объект по userId, но я знаю, что я хочу снова сгруппировать его по значениям имен, которые равны.

Так, например, у меня есть данные:

"data": [
        {
            "name": "Red",
            "userId": "batman"
        },
        {
            "name": "Red",
            "userId": "batman"
        },
        {
            "name": "Blue",
            "userId": "batman"
        }
]

Я хотел бы что-то вроде:

[
  {userId: "Batman",
  name: {
   "red": 2
   "blue": 1
  }}
]

В основном, чтобы помочь мне дать представление, из которого я могу произвести что-то вроде:

Red - 2 - batman
Blue - 1 - batman

У меня есть это до сих пор

console.log(
        chain(data)
            .groupBy("userId")
            .map((value, key) => ({ userId: key, name: value }))
            .value()
);

Но это дает мне группу только по идентификатору пользователя.

Буду признателен за любые идеи / помощь.

Спасибо

ОБНОВЛЕНИЕ - решено с помощью также требуется вторая функция:

function filterArr(data: any, key: any){
        return data.reduce( (result: any, current: any) => {
            if(!result[current[key]]){
                result[current[key]] = 1;
            } else {
                result[current[key]] += 1;
            }
            return result;
        }, {})
    }

с:

console.log(
        chain(data)
            .groupBy("userId")
            .map((value, key) => ({ userId: key, name: filterArr(value, "name") }))
            .value()
);

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Я решил ваш вопрос, основываясь на структуре объекта, которую вы запросили

const _ = require("lodash");
const data = [
  {
    name: "Red",
    userId: "batman"
  },
  {
    name: "Red",
    userId: "batman"
  },
  {
    name: "Blue",
    userId: "batman"
  },
  {
    name: "Blue",
    userId: "gangam"
  }
];
let results = [];
const grouppedData = _.groupBy(data, "userId");

for (let userId in grouppedData) {
  const name = grouppedData[userId].reduce(
    (acc, val) => ({
      ...acc,
      [val.name]: acc[val.name] ? acc[val.name] + 1 : 1
  }),{});

  results.push({
    userId,
    name
  });
}

console.log(results);

Я также создал рабочую песочницу здесь

0 голосов
/ 14 апреля 2020

Вы можете использовать reduce метод массива, чтобы получить требуемый вывод.

Пожалуйста, проверьте ниже рабочий фрагмент кода:

const arr = [{"name":"Red","userId":"batman"},{"name":"Red","userId":"batman"},{"name":"Blue","userId":"batman"}];

let result = arr.reduce((r,{userId,name})=>{
   let rec = r.find(o => o.userId === userId);
    if(rec){
        rec.name[name] = (rec.name[name] || 0) + 1;
    }else{
        r.push({userId:userId,name:{[name]:1}});
    }
    return r;
},[]);

console.log(result);
...