簡體   English   中英

Javascript:對對象中的對象進行排序

[英]Javascript: sorting objects in objects

如您所料-我被卡住了;)我的問題是我有一個對象,其中包含一些其他對象:

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),buggy(872))或字符串(例如“姓”)。 更重要的是,我希望它仍然是一個對象(我正在其他幾個函數中使用它;))

我在這里嘗試了一些想法形式(例如轉換為數組),但是都無效。 最好的選擇是什么?

由於對象是通過引用存儲的,因此您可以擁有一個數組和一個對相同的基礎播放器對象進行操作的對象:

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

現在,您可以通過在players下方的名稱或在playersByRank下的相對排名訪問玩家,例如,將玩家“ buggy” playersByRank排名最高的玩家相同:

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

您可以對鍵進行排序,然后返回一個可迭代的對象。 這樣,您就可以循環播放它。

另一種方法是使用帶有鍵Etc的簡單數組,但是這種方法(可迭代對象)更干凈。

讓我們創建一個名為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; } 

資源

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM