给出这个无序的平面对象数组
var obj = [
{
id: 1,
parentId: null
},
{
id: 2,
parentId: 1
},
...
}];
我想根据层次结构深度级别设置属性$level
。 (没有最大深度)
所以结果将是
var obj = [
{
id: 1,
parentId: null,
$level = 0
},
{
id: 2,
parentId: 1,
$level = 1
},
...
}];
我正在考虑为此编写一个递归函数,它将遍历数组并找到匹配的parentId == id
然后如果还有一个父级,那么再次找到匹配的...同时保持计数的数量调用它来达到根。但这是一个很多的数组迭代。这看起来很糟糕。
因此认为这是一个已解决的问题。但搜索没有给我任何有用的东西。所以我来到这里:)
你会如何解决这个问题?
答案 0 :(得分:2)
基本上有setLevel(parentId, level)
,一个递归函数。起始值为null
和零级。该功能有两个部分。首先获取parentId等于给定parentId的所有行。然后迭代行并分配级别并使用id作为parentId的新值和更高级别来调用itselft。
var obj = [
{
id: 2,
parentId: 1
},
{
id: 1,
parentId: null
},
{
id: 5,
parentId: 4
},
{
id: 4,
parentId: 2
},
{
id: 3,
parentId: 2
},
];
function setLevel(parentId, level) {
obj.filter(function (el) {
return el.parentId === parentId;
}).forEach(function (el) {
el.$level = level;
setLevel(el.id, level + 1);
});
}
setLevel(null, 0);
document.write('<pre>'+ JSON.stringify(obj, null, 4) + '</pre>');
答案 1 :(得分:0)
在我看来,你没有多少选择解决方案。 对于每个元素,您必须遍历数组,搜索元素的祖先数,递归或迭代方式。
在这种情况下,您只需搜索具有正确ID的obj。
您无法直接呼叫父级的直接$level
,因为您的数组未订购,因此父级$level
并非始终设置。