gpt4 book ai didi

javascript - 通过属性对对象使用嵌套归约

转载 作者:行者123 更新时间:2023-11-29 10:02:07 26 4
gpt4 key购买 nike

我有这样的数据:

const data = [
{ id: 1, cat: "human", age: "10" },
{ id: 2, cat: "human", age: "20" },
{ id: 3, cat: "human", age: "10" },
{ id: 4, cat: "animal", age: "10" },
{ id: 5, cat: "animal", age: "20" },
{ id: 6, cat: "animal", age: "10" },
{ id: 7, cat: "alien", age: "10" },
{ id: 8, cat: "alien", age: "20" },
{ id: 9, cat: "alien", age: "10" },
];

我想像这样对这些数据进行分组:

const gr = {
human: {
all: [
{ id: 1, cat: "human", age: "10" },
{ id: 2, cat: "human", age: "20" },
{ id: 3, cat: "human", age: "10" },
],
ages: {
"10": [
{ id: 1, cat: "human", age: "10" },
{ id: 3, cat: "human", age: "10" },
],
"20": [
{ id: 2, cat: "human", age: "20" },
],
}
},
animal: {...},
alien: {...},
}

我先这样减少:

const gr = data.reduce((acc, el) => {
const { cat } = el;
acc[cat] = acc[cat] || { all: [] };
acc[cat].all.push(el);

return acc;
}, {});

但是我不能在这里做一个嵌套的reduce。我可以像那样单独做:

const grAge = gr.human.all.reduce((acc,el) => {
const {age} = el;
acc[age] = acc[age] || [];
acc[age].push(el);

return acc;
},{});

gr.human["ages"] = grAge;

但很明显,这样做效率不高,需要做更多的工作。可能是这样的:

Object.keys(gr).forEach(key => {
const grAge = gr[key].all.reduce((acc,el) => {
const {age} = el;
acc[age] = acc[age] || [];
acc[age].push(el);

return acc;
},{});

gr[key]["ages"] = grAge;
});

我可以一步加入这些 reduce 吗?

如果有其他好的方法我可以使用它们,我不需要使用reduce方法。

最佳答案

您可以采用单循环方法并将所需结构分配给 all 或嵌套结构。

如果您想获得一个更动态的版本,您需要简化每个嵌套级别的结果结构(这意味着年龄级别将包含一个 all 属性)。

const
data = [{ id: 1, cat: "human", age: "10" }, { id: 2, cat: "human", age: "20" }, { id: 3, cat: "human", age: "10" }, { id: 4, cat: "animal", age: "10" }, { id: 5, cat: "animal", age: "20" }, { id: 6, cat: "animal", age: "10" }, { id: 7, cat: "alien", age: "10" }, { id: 8, cat: "alien", age: "20" }, { id: 9, cat: "alien", age: "10" }],
result = data.reduce((r, o) => {
r[o.cat] = r[o.cat] || { all: [], ages: {} };
r[o.cat].all.push(o);
r[o.cat].ages[o.age] = r[o.cat].ages[o.age] || [];
r[o.cat].ages[o.age].push(o);
return r;
}, {});

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

关于javascript - 通过属性对对象使用嵌套归约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54124834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com