在 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 数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在 cassandra 中使用可能的空值对嵌套数据进行建模

json语法规则

JSON 语法

JSON语法规则

JSON 语法

JSON 语法