在 JavaScript 中使用空值对 JSON 数组进行排序
Posted
技术标签:
【中文标题】在 JavaScript 中使用空值对 JSON 数组进行排序【英文标题】:Sorting JSON array with nulls in JavaScript 【发布时间】:2019-12-15 21:17:57 【问题描述】:我的 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);
救命!!
【问题讨论】:
预期的排序逻辑不清楚 @Emil 您的预期结果看起来不像是按 id 排序然后按父项排序 【参考方案1】:您首先需要一个topological sorting,然后按出现顺序获取节点。
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;
【讨论】:
他想达到什么目的? 哦,它的二叉树。【参考方案2】:如果 parent 为 null,我们使用 id 作为父值并首先按父排序(否则我们将无法获得您的结果)。如果父值比较结果为零,我们按id排序。
var jData = [id:5,parent:2,id:1,parent:null,id:4,parent:2,id:2,parent:null,id:3,parent:1,id:6,parent:1];
let res = jData.sort((a,b) =>
let ap = a.parent ? a.parent : a.id,
bp = b.parent ? b.parent : b.id;
return ap - bp || a.id - b.id;
);
console.log(res);
【讨论】:
【参考方案3】:您可以使用reduce
将每个数组分组到其父数组。如果 parent 为 null,则使用 0
。使用另一个reduce
构造最终数组。
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]
var temp = jData.reduce((c, v) =>
let p = v.parent || 0;
c[p] = c[p] || [];
c[p].push(v);
return c;
, );
var newjData = temp[0].reduce((c, v) =>
var o = temp[v.id] || [];
o.sort((a, b) => a.id - b.id); //Sort. Incase the IDs are not in order in the original array.
c.push(v, ...o);
return c;
, []);
console.log(newjData);
【讨论】:
以上是关于在 JavaScript 中使用空值对 JSON 数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章