【问题标题】:Sorting an array nested in an object which is nested in another object对嵌套在另一个对象中的对象中嵌套的数组进行排序
【发布时间】:2015-12-18 16:57:58
【问题描述】:

我有一个名为“团队”的对象,每个团队名称都有一组嵌套对象。在那个团队名称中,我有球员,我希望对每个数组进行动态排序,而不是为每个 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

我觉得我在这里遗漏了一些简单的东西。谁能帮帮我?

【问题讨论】:

  • 我相信sort 函数不会改变原始值。如果这是您想要的行为,您需要将 .sort() 的输出分配回对象

标签: javascript arrays sorting object nested


【解决方案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);
    }
}

如果我是对的,你在试图理解发生了什么时没有得到的是,你可以通过直接调用(例如team.fnatic.player)和通过通过字符串调用它(例如team['fnatic'].player),这就是为什么您可以遍历对象并获取所有子对象,以获取players 属性(这是一个数组),然后对该数组进行排序。

【讨论】:

    【解决方案2】:

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

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

    排序到位 (mdn):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-06
      • 2016-07-01
      • 2019-06-25
      • 2015-11-10
      • 1970-01-01
      • 2019-01-10
      • 2019-09-30
      相关资源
      最近更新 更多