将对象的平面数组转换为对象的嵌套数组,通常是指将一个包含多个对象的数组,根据某个属性(如ID)将其分组,使得具有相同属性值的对象被组织在一起,形成一个嵌套的数组结构。
假设我们有一个包含用户信息的平面数组:
const users = [
{ id: 1, name: 'Alice', parentId: null },
{ id: 2, name: 'Bob', parentId: 1 },
{ id: 3, name: 'Charlie', parentId: 1 },
{ id: 4, name: 'David', parentId: 2 },
{ id: 5, name: 'Eve', parentId: 3 }
];
我们可以将其转换为嵌套数组:
function groupUsers(users) {
const map = new Map();
const roots = [];
users.forEach(user => {
map.set(user.id, { ...user, children: [] });
});
users.forEach(user => {
if (user.parentId === null) {
roots.push(map.get(user.id));
} else {
const parent = map.get(user.parentId);
if (parent) {
parent.children.push(map.get(user.id));
}
}
});
return roots;
}
const nestedUsers = groupUsers(users);
console.log(nestedUsers);
问题:在转换过程中,某些对象没有正确分组。
原因:
parentId
)错误或缺失导致的。解决方法:
parentId
)是正确的,并且没有缺失。console.log
或其他调试工具检查转换逻辑,确保每一步都正确执行。例如,可以在关键步骤添加console.log
来检查:
function groupUsers(users) {
const map = new Map();
const roots = [];
users.forEach(user => {
console.log('Mapping user:', user);
map.set(user.id, { ...user, children: [] });
});
users.forEach(user => {
console.log('Grouping user:', user);
if (user.parentId === null) {
console.log('Root user:', user);
roots.push(map.get(user.id));
} else {
const parent = map.get(user.parentId);
if (parent) {
console.log('Adding child:', user, 'to parent:', parent);
parent.children.push(map.get(user.id));
} else {
console.error('Parent not found for user:', user);
}
}
});
return roots;
}
通过这种方式,可以更容易地找到问题所在并进行修复。
领取专属 10元无门槛券
手把手带您无忧上云