按递减值对JS对象排序(使用未知键)

时间:2019-06-04 17:49:36

标签: javascript sorting ecmascript-6

我试图按最高整数值对具有未知键的简单对象进行排序。是否有简洁的代码可以做到这一点?

我已经尝试过了,但是没有成功。

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
}

4 个答案:

答案 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]);

enter image description here

对于将对象更改为已排序的数组,因为如果尝试在控制台中扩展obj,它将再次显示未排序的,但实际上它是已排序的;为了完全清楚,我们的疑问是,我们可以将该对象更改为数组 使用以下代码

var result = Object.keys(newObj).map(function(key) {
  return [key, newObj[key]];
});
console.log(result);

如下图所示 enter image description here

答案 3 :(得分:0)

另一个选择-使用Object.entriesleaderboard创建一个数组,按值对它进行排序,然后将单个对象重建为一个数组,以保持排序顺序。

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]})))