如何对这样格式化的数组进行排序?

时间:2019-01-20 22:40:22

标签: javascript arrays sorting

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

[{
  "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 } } ]

谢谢!

Codingpro

4 个答案:

答案 0 :(得分:3)

如果所需的输出是具有有序键的对象,则无法完成(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)

答案 1 :(得分:2)

当前数据结构不可能做到

您基本上要在数组中排序一个元素...默认情况下,该元素已经排序。而且不可能对对象中的键进行排序,因为它们没有特定的顺序。

为使示例工作,您需要在列表中创建多个元素进行排序。这是您可以做什么的示例。

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

const res = data.sort((a,b)=>{
  return Object.values(a).shift().walls - Object.values(b).shift().walls;
});

console.log(res);

答案 2 :(得分:1)

这里您有另一种使用实验性flatMap()的方法,并且如果您有一个包含多个包含数据的对象的初始数组,则该方法也将起作用:

const input = [
  {
    "536606220753305611": { "walls": 4 },
    "137616812886982656": { "walls": 5 },
    "189862971520843776": { "walls": 4 },
    "230433188491558913": { "walls": 2 }
  },
  {
    "336606220753305611": { "walls": 9 },
    "437616812886982656": { "walls": 7 },
    "789862971520843776": { "walls": 23 },
    "90433188491558913": { "walls": 1 }
  }
];

let res = input.flatMap(e => Object.entries(e))
  .sort((a, b) => a[1].walls - b[1].walls)
  .map(([key, value]) => ({[key]: value}));

console.log(res);

答案 3 :(得分:1)

如果您希望保持相似的结构但对键/值进行排序,则可以始终将数组替换为Map

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

// Create a new Map from your existing data
const map = new Map(Object.entries(data[0]));

// Create an array of Map entries sorted by wall value
// and then create a new Map from that array
const sortedMap = new Map([...map.entries()].sort((a, b) => {
  return a[1].walls < b[1].walls;
}));

// Voila, a sorted Map
for (let [k, v] of sortedMap.entries()) {
  console.log(k, v);
}