我试图按最高整数值对具有未知键的简单对象进行排序。是否有简洁的代码可以做到这一点?
我已经尝试过了,但是没有成功。
let fixSort = {};
Object.keys(leaderboard).sort().forEach(function(key){
fixSort[key] = leaderboard[key];
});
console.log(fixSort);
这里是对象:
let leaderboard = {
"Bob" : 2,
"Jimmy" : 1,
"Emma" : 6
}
我的目标是将其排序为:
{
"Emma" : 6,
"Bob" : 2,
"Jimmy" : 1
}
答案 0 :(得分:4)
“你可以”:
const fixSort = {};
for(const [k, v] of Object.entries(leaderboard).sort((a, b) => a[1] - b[1]))
fixSort[k] = v;
}
但是,老实说,这是构造此问题的一种坏方法(因为添加新的键值对是不可能的,因为您必须重新创建整个对象)。而是使用对象数组:
const leaderboard = [
{ name: "Jack", score: 7 },
//...
];
如果需要查找表,则只需基于该对象创建一个查找表即可。
const byName = {};
for(const player of leaderboard)
byName[player.name] = player;
确保您还可以对数组进行排序:
leaderboard.sort((a, b) => a.score - b.score);
然后,您可以轻松添加/删除播放器。
function addToLeaderBoard(player) {
leaderboard.push(player);
leaderboard.sort((a, b) => a.score - b.score);
byName[player.name] = player;
}
答案 1 :(得分:0)
您已经接近了,但是Array.prototype.sort可以接受自定义比较功能。那就是你想要的。
// Gives you an array
const keyArray = Object.keys(leaderboard)
const fixedSort = keyArray.sort((a, b) => {
if (leaderboard[a] > leaderboard[b]) {
return 1
}
return -1
})
console.log(fixedSort);
答案 2 :(得分:0)
let leaderboard = {
"Bob" : 2,
"Jimmy" : 1,
"Emma" : 6
}
var newObj={};
Object.keys(leaderboard).sort((a,b)=>leaderboard[b]-leaderboard[a]).forEach((i, v)=> newObj[i]=leaderboard[i]);
对于将对象更改为已排序的数组,因为如果尝试在控制台中扩展obj,它将再次显示未排序的,但实际上它是已排序的;为了完全清楚,我们的疑问是,我们可以将该对象更改为数组 使用以下代码
var result = Object.keys(newObj).map(function(key) {
return [key, newObj[key]];
});
console.log(result);
答案 3 :(得分:0)
另一个选择-使用Object.entries
从leaderboard
创建一个数组,按值对它进行排序,然后将单个对象重建为一个数组,以保持排序顺序。
const leaderboard = {
"Bob" : 2,
"Jimmy" : 1,
"Emma" : 6
}
console.log(Object.entries(leaderboard).sort((a,b) => b[1] - a[1]).map(person => ({[person[0]]: person[1]})))