首页 > 解决方案 > 如何对这样格式的数组进行排序?

问题描述

我试图通过“墙”对这样的数组进行排序:

[{
  "536606220753305611": { "walls": 4 },
  "137616812886982656": { "walls": 5 },
  "189862971520843776": { "walls": 4 },
  "230433188491558913": { "walls": 2 }
}]

我似乎无法使用 array.sort 从 id 中访问数组。

这是我尝试过的:

let top10 = array.sort(function(a,b){
  return a.walls.localeCompare(b.walls).slice(0, 10);
 });

它在这里不起作用,因为我找不到如何进入 id 数组。

我希望我记录的结果是有序的,但它显示了这个:

[ { '536606220753305611': { walls: 4 },
    '137616812886982656': { walls: 5 },
    '189862971520843776': { walls: 4 },
    '230433188491558913': { walls: 2 } } ]

谢谢!

编码专业

标签: javascriptarrayssorting

解决方案


如果所需的输出是具有有序键的对象,则无法完成(JS 对象的属性本质上是无序的)。您可以先将输入转换为对象数组,然后对它们进行排序......

let data = [{
  "536606220753305611": { "walls": 4 },
  "137616812886982656": { "walls": 5 },
  "189862971520843776": { "walls": 4 },
  "230433188491558913": { "walls": 2 }
}]

// transform the input object into an array of objects of the form:
//
// [ { "long string of digits" : { walls : 4 } },
//   { "long string of digits" : { walls : 2 } },
//   etc.
// ]
let data0 = data[0];
let objects = Object.keys(data0).map(k => {
    return { k: data0[k] }
});

let sorted = objects.sort((a, b) => {
    let keyA = Object.keys(a)[0];
    let keyB = Object.keys(b)[0];
    return a[keyA].walls - b[keyB].walls;

});

console.log(sorted)


推荐阅读