如何创建一个香草 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.entries
和map
的输出再次获取到一个数组中。
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);
有一个函数可以按键对 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.entries
和map
的输出再次获取到一个数组中。
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);