gpt4 book ai didi

javascript - 按 parentId javascript 对平面数组进行排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:39:39 26 4
gpt4 key购买 nike

每个父元素都应包含所有子类别的总数。如果解决方案将使用仅 Array 对象方法而不使用 while 循环,那将是非常好的。

这是基础结构的例子:

const base = [
{ id: 1, count: 2, parentId: null },
{ id: 2, count: 4, parentId: 1 },
{ id: 3, count: 0, parentId: 2 },
{ id: 6, count: 8, parentId: 3 },
{ id: 7, count: 8, parentId: 3 },
{ id: 8, count: 2, parentId: 7 },
{ id: 4, count: 2, parentId: null },
{ id: 5, count: 1, parentId: 4 },
];

它应该是这样的:

const expected = [
{ id: 1, count: 2, total: 24, parentId: null },
{ id: 2, count: 4, total: 22, parentId: 1 },
{ id: 3, count: 0, total: 18, parentId: 2 },
{ id: 6, count: 8, total: 8, parentId: 3 },
{ id: 7, count: 8, total: 10, parentId: 3 },
{ id: 8, count: 2, total: 2, parentId: 7 },
{ id: 4, count: 2, total: 3, parentId: null },
{ id: 5, count: 1, total: 1, parentId: 4 },
];

这是我当前的代码。我想在这里不知何故我需要去最后一层然后从最后一个项目开始到顶部连接 prev 级别与当前level count 属性值,这就是我命名 IIFE 的原因。

let c = a.map(cat => {
const top = a.filter(v => cat.id === v.parentId);
let test;
return ({
...cat,
total: (test = categs => {
return categs.reduce((acc, val) => {
/* ??? */
return acc + val.count
}, cat.count);
})(top)
})
})

最佳答案

这是一个尝试:

const base = [
{ id: 1, count: 2, parentId: null },
{ id: 2, count: 4, parentId: 1 },
{ id: 3, count: 0, parentId: 2 },
{ id: 6, count: 8, parentId: 3 },
{ id: 7, count: 8, parentId: 3 },
{ id: 8, count: 2, parentId: 7 },
{ id: 4, count: 2, parentId: null },
{ id: 5, count: 1, parentId: 4 },
];

const getDescendants = ({ id }) =>
base.reduce((acc, n) => n.parentId === id ? [...acc, n, ...getDescendants(n)] : acc, []);
const expected =
base.map(record => ({
...record,
total: getDescendants(record).reduce((acc, cur) => acc + cur.count, record.count)
}));

console.log(expected);

这里真正的技巧是 getDescendants 函数。它获取所有元素的数组,这些元素的 parentId 属性等于当前记录的 id 与该节点的所有后代连接,由递归应用该函数确定。

该解决方案效率不高,但鉴于该问题明确禁止使用某些核心编程结构,我怀疑这是一项要求。


这是另一种方法,递归地修改原始数组:

const base = [
{ id: 1, count: 2, parentId: null },
{ id: 2, count: 4, parentId: 1 },
{ id: 3, count: 0, parentId: 2 },
{ id: 6, count: 8, parentId: 3 },
{ id: 7, count: 8, parentId: 3 },
{ id: 8, count: 2, parentId: 7 },
{ id: 4, count: 2, parentId: null },
{ id: 5, count: 1, parentId: 4 },
];

const addToTotal = (id, count) => id !== null && base.forEach(n => {
if (n.id === id) {
n.total = (n.total || 0) + count;
addToTotal(n.parentId, count);
}
});
base.forEach(n => {
n.total = (n.total || 0) + n.count;
addToTotal(n.parentId, n.count);
});

console.log(base);

关于javascript - 按 parentId javascript 对平面数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54876419/

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