当某些键为数字 [Duplicate] 时,按对象键对数据进行排序不起作用

sorting data by object keys does not work when some of the keys are numeric [duplicate]

提问人:U rock 提问时间:7/1/2019 最后编辑:Madara's GhostU rock 更新时间:8/13/2019 访问量:234

问:

我有对象包含这样的数据

const testData = {
        "11": {
            "data": {
                "firstName": "firstName",
                "lastName": "lastName"
            }
        },
        "12": {
            "data": {
                "firstName": "firstName",
                "lastName": "lastName"
            }
        },
        "00": {
            "data": {
                "firstName": "firstName",
                "lastName": "lastName"
            }
        },
        "01": {
            "data": {
                "firstName": "firstName",
                "lastName": "lastName"
            }
        },
        "final": {
            "data": {
                "firstName": "firstName",
                "lastName": "lastName"
            }
        }
    }

我想按对象键对这些数据进行排序,例如00, 01, 11, 12, final

我试过这样,但我无法实现我想要的。任何想法将不胜感激?

sorted = Object.keys(testData).sort().reduce((acc, key) => ({
  ...acc, [key]: testData[key]
  }), {})

console.log(sorted)
JavaScript 对象

评论

0赞 Nina Scholz 7/1/2019
首先对可能作为数组索引的值进行排序,然后按插入顺序排序。双零不是索引,也不是带有前导零的值。
0赞 Nina Scholz 7/1/2019
为什么不取一个数组呢?至少是一个键数组?
0赞 U rock 7/1/2019
根据要求,我只想使用对象
0赞 Nina Scholz 7/1/2019
您喜欢如何访问数据?
0赞 VLAZ 7/1/2019
JavaScript 不保证属性键的顺序甚至在 ES6 中也没有

答:

7赞 Madara's Ghost 7/1/2019 #1

你不能。JavaScript 对象键定义的迭代顺序如下:

  1. 数字键,按数字升序排列。(这包括诸如 ,但不是 )、THEN..."11""01"
  2. 非数字的字符串键,按插入顺序排列。然后。。。
  3. 符号键,按其插入顺序排列。

如您所见,无论插入顺序如何,数字键将始终以迭代顺序首先出现,并且始终按其数字顺序出现。

在你的例子中,无论你做什么,它总是会排在第一位"11""12"

一般来说,依赖对象的顺序(本质上是你通过键访问的无序字典)是不明智的。如果顺序很重要,你应该使用数组。或者,您可以使用 .Map

评论

0赞 U rock 7/2/2019
如果我像这个“011”一样在“11”前面加 0 怎么办。这将按照我们的需要进行排序,排序后,我们需要删除所有键中的前 0。
0赞 Madara's Ghost 7/2/2019
当你在对象中拥有键“11”和键“01”的那一刻,无论如何,“11”总是排在第一位。如果添加填充 0,然后在将其放入对象之前将其删除,则不会执行任何操作。不过说真的,使用 Map 或数组。
0赞 U rock 7/2/2019
您能否提供有效使用地图的演示。
0赞 U rock 7/2/2019
如果我将“0”、“1”、“12”、“14”设置为这样,我可以期望所有浏览器中的保证顺序吗?
0赞 U rock 7/2/2019
我通过在所有键之前添加特殊字符来更新我的帖子。
-2赞 Julliano Osorio 7/1/2019 #2

尝试这样的事情:

sorted = Object.keys(testData).sort((a,b) => {
    if (a < b) return -1;
    if (a > b) return 1;
    return 0;
});

console.log(sorted)

评论

0赞 U rock 7/1/2019
我们可以得到上面的结果,这没有帮助,我应该轮换整个数据Object.keys(testData).sort()