【问题标题】:Javascript: sorting objects in objectsJavascript:对对象中的对象进行排序
【发布时间】:2018-08-18 08:35:17
【问题描述】:

如你所想 - 我被困住了 ;) 我的问题是我有一个包含其他对象的对象:

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

我想做的是按“排名”对“玩家”对象进行排序: (汤米(101),瓦伦蒂诺(788),越野车(872)) 或通过字符串(例如“姓氏”)。更重要的是,我希望它仍然是一个对象(我在其他几个功能中使用它;))

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

【问题讨论】:

  • 你不能,对象没有任何特定的顺序。改用数组。
  • 你不能这样做,顺便说一句,对对象的键进行排序是不必要的(没有意义)。

标签: javascript sorting object


【解决方案1】:

由于对象是通过引用存储的,因此您可以在相同的底层播放器对象上操作一个数组和一个对象:

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

现在您可以通过players 下的名称或playersByRank 下的相对排名来访问玩家,例如带玩家“越野车”与带走排名最高的玩家是一样的:

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

【讨论】:

  • 您可以添加一个代码 sn-p 而不仅仅是代码吗? :)
  • @zfrisch 不,我不能。
【解决方案2】:

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

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

让我们创建一个名为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);
.as-console-wrapper { max-height: 100% !important; top: 0; }

资源

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-04
    • 2018-03-18
    • 1970-01-01
    • 2021-08-19
    • 2019-01-08
    • 2011-05-12
    • 2013-07-15
    • 2011-11-16
    相关资源
    最近更新 更多