我试图通过“ 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
答案 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);
}