如何创建一个香草 groupBy 以便它 returns 一个具有标题的 objects 数组?

How to create a vanilla groupBy so that it returns an array of objects that have a title?

有一个函数可以按键对 objects 的数组进行分组。例如一个数组:

     data: [
        {
          CS_NAME: "AAA",
          IS_MAIN: "Y",
          WEBSITE_CREATE_DATE: "2021-06-01T15:50:37.687",
        },
        {
          CS_NAME: "AAA",
          IS_MAIN: "N",
          WEBSITE_CREATE_DATE: "2021-08-03T12:02:58.07",
        },
        {
          CS_NAME: "BBB",
          IS_MAIN: "Y",
          WEBSITE_CREATE_DATE: "2021-08-03T12:02:58.07",
        },
        {
          CS_NAME: "BBB",
          IS_MAIN: "N",
          WEBSITE_CREATE_DATE: "2019-01-26T00:00:00",
        },
        {
          CS_NAME: "CCC",
          IS_MAIN: "Y",
          WEBSITE_CREATE_DATE: "2019-01-26T00:00:00",
        },
      ]

函数分组:

    groupBy(input, key) {
    
              return input.reduce((acc, currentValue) => {
                let groupKey = currentValue[key];
                if (!acc[groupKey]) {
                  acc[groupKey] = [];
                }
                acc[groupKey].push(currentValue);
                return acc;
              }, {});
            },
        
        let obj = groupBy(data, "CS_NAME");

如何更改此函数,使其 returns 一个 objects 的数组,每个数组将有两个字段:

    {
       title: "CS_NAME" // the key by which objects were grouped or any other property
       content: {obj} // the whole object
    }

例如,输出应该是这样的:

    {
      title: "AAA",
      content: [
        {
          CS_NAME: "AAA",
          IS_MAIN: "Y",
          WEBSITE_CREATE_DATE: "2021-06-01T15:50:37.687",
        },
    
        {
          CS_NAME: "AAA",
          IS_MAIN: "N",
          WEBSITE_CREATE_DATE: "2021-08-03T12:02:58.07",
        },
      ],
    }

您可以映射组值并添加一些属性。

const
    groupBy = (input, key) => input.reduce((acc, currentValue) => {
        (acc[currentValue[key]] ??= []).push(currentValue);
        return acc;
    }, {}),
    data = [{ CS_NAME: "AAA", IS_MAIN: "Y", WEBSITE_CREATE_DATE: "2021-06-01T15:50:37.687" }, { CS_NAME: "AAA", IS_MAIN: "N", WEBSITE_CREATE_DATE: "2021-08-03T12:02:58.07" }, { CS_NAME: "BBB", IS_MAIN: "Y", WEBSITE_CREATE_DATE: "2021-08-03T12:02:58.07" }, { CS_NAME: "BBB", IS_MAIN: "N", WEBSITE_CREATE_DATE: "2019-01-26T00:00:00" }, { CS_NAME: "CCC", IS_MAIN: "Y", WEBSITE_CREATE_DATE: "2019-01-26T00:00:00" }],
    result = Object
        .entries(groupBy(data, "CS_NAME"))
        .map(([title, content]) => ({ title, content }));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

您可以按如下方式更新 groupBy 函数以获得所需的输出。 将当前带Object.entriesmap的输出再次获取到一个数组中。

const data = [ { CS_NAME: "AAA", IS_MAIN: "Y", WEBSITE_CREATE_DATE: "2021-06-01T15:50:37.687", }, { CS_NAME: "AAA", IS_MAIN: "N", WEBSITE_CREATE_DATE: "2021-08-03T12:02:58.07", }, { CS_NAME: "BBB", IS_MAIN: "Y", WEBSITE_CREATE_DATE: "2021-08-03T12:02:58.07", }, { CS_NAME: "BBB", IS_MAIN: "N", WEBSITE_CREATE_DATE: "2019-01-26T00:00:00", }, { CS_NAME: "CCC", IS_MAIN: "Y", WEBSITE_CREATE_DATE: "2019-01-26T00:00:00", }, ];

const groupBy = (input, key) => {
  return Object.entries(
    input.reduce((acc, currentValue) => {
      let groupKey = currentValue[key];
      if (!acc[groupKey]) {
        acc[groupKey] = [];
      }
      acc[groupKey].push(currentValue);
      return acc;
    }, {})
  ).map(([title, content]) => ({ title, content }));
};

const obj = groupBy(data, "CS_NAME");

console.log(obj);