Javascript:对象中的对象排序

时间:2018-03-09 17:47:32

标签: javascript sorting object

你可能会认为 - 我被卡住了;) 我的问题是我有一个带有其他对象的对象:

let players = {
  buggy: {
    name: 'John',
    surname: 'Cocroach',
    rank: 872
  },
  valentino: {
    name: 'Antonio',
    surname: 'Valencia',
    rank: 788
  },
  tommy: {
    name: 'Tom',
    surname: 'Witcher',
    rank: 101
  },
};

我想要做的是按“等级”对“玩家”对象进行排序: (tommy(101),valentino(788),越野车(872)) 或通过字符串(例如“姓”)。更重要的是,我希望它仍然是一个对象(我在其他几个函数中使用它;))

我在这里尝试了一些想法(例如转换为数组),但都是无效的。什么是最好的选择?

2 个答案:

答案 0 :(得分:1)

当对象通过引用存储时,您可以在同一个底层播放器对象上运行一个数组和一个对象:

 const playersByRank = Object.values(players).sort((a, b) => a.rank - b.rank);

现在,您可以通过players下的名称或playersByRank下的相对等级来访问播放器,例如将玩家“越野车”与获得排名最高的玩家相同:

players.buggy.test = "works";
console.log(playersByRank[0].test);

答案 1 :(得分:1)

您可以对键进行排序,然后返回可迭代对象。这样你就可以循环它了。

另一种方法是使用带有键的简单数组,Etc,但这种方法(可迭代对象)更清晰。

让我们创建一个名为UILabel的函数,此函数将返回一个可迭代的玩家对象。

重要提示:请注意sortAsIterable(..)



IE

let players = {  buggy: {    name: 'John',    surname: 'Cocroach',    rank: 872  },  valentino: {    name: 'Antonio',    surname: 'Valencia',    rank: 788  },  tommy: {    name: 'Tom',    surname: 'Witcher',    rank: 101  },};

function sortAsIterable(obj) {
  let sortedKeys = Object.keys(obj).sort(function(a, b) {
    return obj[a].rank - obj[b].rank;
  });
  
  let myIterable = {}, index = 0;
  myIterable[Symbol.iterator] = function*() {
    for (let k of sortedKeys) yield {[k]: obj[k]};
  };
  
  return myIterable;
}

// Object sorted.
let sortedPlayers = sortAsIterable(players); 
players.buggy.name = "Ele"; // This is to illustrate the live access to the values.

// Now you can iterate them .
// You can do this as much as you want, for example in different parts of your code.
for (let player of sortedPlayers) console.log(player);




资源