knockout.js 在JavaScript中使用空值对JSON数组进行排序

kognpnkq  于 2022-11-10  发布在  Java
关注(0)|答案(3)|浏览(158)

我的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);

救命啊!

7fyelxc5

7fyelxc51#

首先需要一个topological sorting,然后按出现的顺序获取节点。
第一个

wj8zmpe1

wj8zmpe12#

如果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);
mcvgt66p

mcvgt66p3#

您可以使用reduce将每个数组分组到其父数组。如果父数组为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);

相关问题