为什么在标准化状态形状中需要所有"ID"的数组?

nol*_*awi 7 normalizr

comments : {
    byId : {
        "comment1" : {
            id : "comment1",
            author : "user2",
            comment : ".....",
        },
        "comment2" : {
            id : "comment2",
            author : "user3",
            comment : ".....",
        },
        "comment3" : {
            id : "comment3",
            author : "user3",
            comment : ".....",
        },
        "comment4" : {
            id : "comment4",
            author : "user1",
            comment : ".....",
        },
        "comment5" : {
            id : "comment5",
            author : "user3",
            comment : ".....",
        },
    },
    allIds : ["comment1", "comment2", "comment3", "commment4", "comment5"]
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我需要包含它是否有任何原因api包括它.我假设这样你可以更快地计算,你可以排序,但一般我不理解是否有性能损失.

Rob*_*ise 8

这不是Redux所要求的任何东西,这是一个标准化的东西.要回答您的问题,在某些情况下,无法回复 JavaScript对象以保留排序顺序.将ID放在数组中可以保留规范化之前存在的排序顺序.

引用Redux的共同维护者和Redux docs的"规范状态部分"的作者:

对于ID数组,虽然JS引擎现在有一个相当标准化的过程来迭代对象中的键,但您不应该依赖它来定义排序.存储ID数组允许您定义项目的顺序.

  • *"为了回答你的问题,JavaScript对象不保证属性出现的顺序."*是的,从ES2015开始,它们可以看到[这里](http://www.ecma-international.org/ecma- 262/8.0/index.html#sec-ordinaryownpropertykeys)和[here](http://www.ecma-international.org/ecma-262/8.0/index.html#sec-enumerate-object-properties)和Oriol的解释[这里](/sf/answers/2164332761/).ES2015和`JSON.stringify`中添加的新操作遵循顺序.传统操作(`Object.keys`,`for-in`)不是必需的.但是**JSON**没有属性订单.:-) (2认同)
  • normalizr是在2014年创建的,React应用程序可以在IE 9的旧浏览器中使用,normalizr不返回JSON,因此JSON缺少属性顺序在这里不相关,规范在枚举数据时不需要遵守排序顺序(这在React应用程序中非常常见),并且该库的作者明确指出不可靠的排序顺序作为他的推理[这里](/sf/ask/2956716171/ ?noredirect = 1#comment71675068_42257112)我将改为"不能依赖保留" (2认同)