你可能会认为 - 我被卡住了;) 我的问题是我有一个带有其他对象的对象:
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)) 或通过字符串(例如“姓”)。更重要的是,我希望它仍然是一个对象(我在其他几个函数中使用它;))
我在这里尝试了一些想法(例如转换为数组),但都是无效的。什么是最好的选择?
答案 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);