对嵌套在另一个对象中的对象嵌套的数组进行排序

时间:2015-09-21 21:08:50

标签: javascript arrays sorting object nested

我有一个名为'team'的对象,每个团队名称都有一组嵌套对象。在那个团队名称中我有玩家,我希望动态地对每个数组进行排序,而不是为每个团队进行排序.xxxx.player.sort();

var team = {
    fnatic: {
        team: "Fnatic",
        player: ["Olofmeister", "JW", "Pronax", "Krimz", "Flusha"]
    },
    titan: {
        team: "Titan",
        player: ["Ex6Tenz", "shox", "RpK", "SmithZz", "Maniac"]
    },
    nip: {
        team: "Ninjas in Pyjamas",
        player: ["GeT_RiGhT", "f0rest", "allu", "friberg", "XizT"]
    },
    nv: {
        team: "EnVy Us",
        player: ["kennyS", "apeX", "NBK-", "Happy", "kioShiMa"]
    },

    vp: {
        team: "Virtus Pro",
        player: ["PashaBiceps", "Taz", "byali", "Snax", "Xx"]
    }
};

我正在尝试按字母顺序对播放器数组进行排序(team.XXXX.player)。我发现我可以通过输入

来做到这一点
team.fnatic.player.sort();

对于每个团队,但我想迭代对象,因为我将有大量的团队与玩家进行排序。

感谢Arne Martin Aurlien on his blog and his object sort function这与我在搜索和阅读的内容一样接近:

for (var obj in team) {
    if (team.hasOwnProperty(obj)) {
        console.log(obj, team[obj].player);  //line 107
        [obj].player = sortObj(team[obj].player);
        console.log(obj, team[obj].player);  //line 109
    }
}

遗憾的是,这仍然只打印出未排序的数组:

fnatic ["Olofmeister", "JW", "Pronax", "Krimz", "Flusha"] script.js:107
fnatic ["Olofmeister", "JW", "Pronax", "Krimz", "Flusha"] script.js:109
titan ["Ex6Tenz", "shox", "RpK", "SmithZz", "Maniac"] script.js:107
titan ["Ex6Tenz", "shox", "RpK", "SmithZz", "Maniac"] script.js:109
...etc for each team

我觉得我在这里缺少一些简单的东西。谁能帮助我?

2 个答案:

答案 0 :(得分:1)

在团队密钥上使用Array.prototype.forEach

Object.keys(team).forEach(function(key) {
    team[key].player.sort();
});

排序已到位(mdn):

  

sort()方法对数组中的元素进行排序并返回   数组。排序不一定稳定。默认排序顺序   是根据字符串Unicode代码点。

答案 1 :(得分:1)

我认为你在写这个功能时误解了Arne Martin Aurlien在做什么。

他想要一种方法来排序对象属性,而不是对象内的数组。他试图做的事情在设计上失败了,因为ECMAScript规范说对象属性没有被索引。

正如你在他的帖子中所看到的,他说:

  

小心使用Chrome。如果您的对象同时包含数字和字符串,则Chrome会先使用数字键对对象进行排序,即使按值排序也是如此。

这并不是一个错误,因为规范明确说明了他试图做的事情,它无法完成。

回到你的问题,你想要做的是:在对象内对数组进行排序。

所以,你已经快到了。你的代码应该是这样的:

for (var obj in team) {
    if (team.hasOwnProperty(obj)) {
        console.log(obj, team[obj].player);
        team[obj].player.sort(); // you only need to call the sort method here
        console.log(obj, team[obj].player);
    }
}

如果我是对的,那么在尝试了解正在发生的事情时你得到的是,你可以通过直接调用它来获取Javascript中对象的属性(例如{{1通过字符串调用它(例如team.fnatic.player),以及为什么你可以遍历对象并获取所有子对象,以获得team['fnatic'].player属性(是一个数组),然后对该数组进行排序。