在展平对象层次结构中设置深度级别的适当性

时间:2015-06-16 10:13:06

标签: javascript

给出这个无序的平面对象数组

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然后如果还有一个父级,那么再次找到匹配的...同时保持计数的数量调用它来达到根。但这是一个很多的数组迭代。这看起来很糟糕。

因此认为这是一个已解决的问题。但搜索没有给我任何有用的东西。所以我来到这里:)

你会如何解决这个问题?

2 个答案:

答案 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并非始终设置。