JavaScript 将对象数组格式化为嵌套子对象

2023-12-01

我有一个带有parentId 和排序值的对象数组,我想将其放入带有嵌套“子项”的数组中并进行适当排序。

例如,这是数据:

[{
    id: 1,
    sort: 2,
    parentId: null,
    name: 'A'
}, {
    id: 2,
    sort: 1,
    parentId: 1,
    name: 'A.1'
}, {
    id: 3
    sort: 2,
    parentId: 1,
    name: 'A.2'
}, {
    id: 4,
    sort: 1,
    parentId: null,
    name: 'B'
}]

我想改变的方式是这样的:

[{
    id: 4,
    sort: 1,
    parentId: null,
    name: 'B',
    children: []
}, {
    id: 1,
    sort: 2,
    parentId: null,
    name: 'A',
    children: [{
        id: 2,
        sort: 1,
        parentId: 1,
        name: 'A.1'
    }, {
        id: 3
        sort: 2,
        parentId: 1,
        name: 'A.2'
    }]
}]

这是已排序的(id 4 位于顶部,因为排序为 1),并且子项是嵌套的并且也相应地排序。

关于执行此操作的好方法有什么建议吗?我可以递归循环以应用子级,但不确定如何保持对此的排序。


这是一个先排序后过滤的提案。

排序采用属性parentId and sort。这对于下一步是必要的,因为“过滤”需要一个排序的数组。

随后对数组进行过滤Array#filter(), 这是thisArgs用于引用可能插入子节点的节点。

编辑:更新未排序(id/parentId) data.

var array = [{ id: 1, sort: 2, parentId: null, name: 'A' }, { id: 2, sort: 1, parentId: 1, name: 'A.1' }, { id: 3, sort: 2, parentId: 1, name: 'A.2' }, { id: 4, sort: 1, parentId: null, name: 'B' }],
    nested;

array.sort(function (a, b) {
    return (a.parentId || -1) - (b.parentId || -1) || a.sort - b.sort;
});

nested = array.filter(function (a) {
    a.children = this[a.id] && this[a.id].children;
    this[a.id] = a;
    if (a.parentId === null) {
        return true;
    }
    this[a.parentId] = this[a.parentId] || {};
    this[a.parentId].children = this[a.parentId].children || [];
    this[a.parentId].children.push(a);
}, Object.create(null));

document.write('<pre>' + JSON.stringify(nested, 0, 4) + '</pre>');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 将对象数组格式化为嵌套子对象 的相关文章

随机推荐