首页 > 解决方案 > 在 JavaScript 中使用空值对 JSON 数组进行排序

问题描述

我的 JSON 数组

var jData = [
{id: 1, parent: null},
{id: 2, parent: null},
{id: 3, parent: 1},
{id: 4, parent: 2},
{id: 5, parent: 2},
{id: 6, parent: 1}];

我希望按如下方式排序(按 id 排序,然后按父级排序)

[
    {id: 1, parent: null},
    {id: 3, parent: 1},
    {id: 6, parent: 1}
    {id: 2, parent: null},    
    {id: 4, parent: 2},
    {id: 5, parent: 2},
];

在 JavaScript 中最好的方法是什么?

我试过了,但没有运气

jData .sort((a, b) => a.id - b.id ||a.parent- b.parent);

帮助!!

标签: javascriptarraysjsonsortingknockout.js

解决方案


您需要先进行拓扑排序,然后按出现顺序获取节点。

function getData(array) {
    return array.flatMap(({ data, children = [] }) => [data, ...getData(children)]);
}

var data = [{ id: 1, parent: null }, { id: 2, parent: null }, { id: 3, parent: 1 }, { id: 4, parent: 2 }, { id: 5, parent: 2 }, { id: 6, parent: 1 }],
    tree = function (data, root) {
        var t = {};
        data.forEach(data => {
            Object.assign(t[data.id] = t[data.id] || {}, { data });
            t[data.parent] = t[data.parent] || {};
            t[data.parent].children = t[data.parent].children || [];
            t[data.parent].children.push(t[data.id]);
        });
        return t[root].children;
    }(data, null),
    result = getData(tree);

console.log(result);
console.log(tree); // just to show what's happening
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读