Фильтровать и группировать по значению ключа - PullRequest
0 голосов
/ 18 апреля 2020

Ниже приведены мои примеры данных,

var data = [
  {
    "Employee Name": "Mr. X",
    "Portfolio Lead": "A"
  },
  {
    "Employee Name": "Mr. Y",
    "Portfolio Lead": "B"
  },
  {
    "Employee Name": "Mr. Z",
    "Portfolio Lead": "C"
  },
  {
    "Employee Name": "Mr. Q",
    "Portfolio Lead": "A"
  },
  {
    "Employee Name": "Mr. P",
    "Portfolio Lead": "A"
  }
];

Теперь мне нужно сгруппировать все элементы массива по его "Portfolio Lead" и pu sh их в новый массив.

Ниже приведен мой code,

const groupBy = (array, key) => {
  return array.reduce((result, currentValue) => {
    (result[currentValue[key]] = result[currentValue[key]] || []).push(
      currentValue
    );
    return result;
  }, {});
};

Приведенный выше код работает, он группируется по ключу, но я хотел, чтобы новый массив был в этой структуре.

Моя текущая структура такая,

{
  "A": [
    {
      "Employee Name": "Mr. X",
      "Portfolio Lead": "A"
    },
    ...
  ],
  "B": [
    {
      "Employee Name": "Mr. Y",
      "Portfolio Lead": "B"
    }
  ],
  "C": [
    {
      "Employee Name": "Mr. Z",
      "Portfolio Lead": "C"
    }
  ]
}

Но нужно ли это так

{
  "Portfolio Lead": "A",
  Count: 3,
  oriData: [....]
}

В настоящее время я застрял с этим, пожалуйста, помогите.

Мой стек Blitz https://stackblitz.com/edit/typescript-nypqge?file=index.ts

Ответы [ 2 ]

1 голос
/ 18 апреля 2020
const groupBy = (array, key) => {
  return Object.entries(array.reduce((result, currentValue) => ({
     ...result,
     [currentValue[key]]: [...(result[currentValue[key]] || []), currentValue]
  }), {})).map(ob => ({"Portfolio Lead": ob[0], oriData: ob[1], Count: ob[1].length}));
};
0 голосов
/ 18 апреля 2020

Мы можем вызвать Object.entries для полученного значения, затем вызвать map для него, чтобы отформатировать его так, как мы хотим:

const groupBy = (array, key) => {
  return Object.entries(array.reduce((result, currentValue) => {
    (result[currentValue[key]] = result[currentValue[key]] || []).push(
      currentValue
    );
    return result;
  }, {})).map(v => ({[key]: v[0], count: v[1].length, oriData: v[1]}));
};
...