2017-09-08 28 views
3
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"] 
} 

在上面的例子中,我有什么理由需要包含它api包括它。我认为这样你可以更快地计数,你可以排序,但通常我不了解是否存在性能问题。为什么在规范化状态下需要所有`ids`数组?

+1

在这情况下需求从何而来?这当然不是JavaScript或React的东西。我不能为Redux说话。 –

+0

这不是Redux的要求。 – Nit

+2

我在几个问题中看到它。显然,这是丹·阿布拉莫夫是怎么做的本教程:https://egghead.io/lessons/javascript-redux-normalizing-the-state-shape – jonahe

回答

5

这不是唯一的要求Redux的东西,这是一个normalizr的事情。要回答你的问题,JavaScript对象can't be replied upon to retain sort order in certain situations。将ID放在数组中允许您保留规范化之前存在的排序顺序。

Quote from co-maintainer of Redux and author of "normalizing state shape section" of Redux docs

至于ID阵列,而JS引擎现在有一个相当标准的过程中物体越过键进行迭代,你不应该依赖于定义排序。存储ID数组可以让您定义项目的顺序。

+2

*“来回答你的问题,JavaScript对象不保证顺序属性出现“。*是的,从ES2015开始,请参阅[此处](http://www.ecma-international.org/ecma-262/8.0/index.html#sec- Ordinownpropertykeys)和[here]( http://www.ecma-international.org/ecma-262/8.0/index.html#sec-enumerate-object-properties)和Oriol的解释[here](https://stackoverflow.com/a/30919039/157247 )。在ES2015中添加了新的操作,并且按照命令“JSON.stringify”。传统操作('Object.keys','for-in')不需要。但** JSON **没有属性顺序。 :-) –

+0

normalizr是在2014年创建的,作出反应的应用程序可以在老的浏览器作为IE 9,列举当normalizr不返回JSON这样JSON缺乏财产秩序的不是与此有关,规格不要求尊重排序顺序您的数据(这是非常常见的应用程序做出反应),和库的作者明确指出不可靠的排序顺序为他的推理[这里](https://stackoverflow.com/questions/42238802/redux-many-to-many -relationship/42257112 noredirect = 1#comment71675068_42257112) 我会改以“不能依靠保留” –

+0

修正:马克写的[正火状态形状(http://redux.js.org/ docs/recipes/redurs/NormalizingStateShape.html)doc用于Redux,并且是Redux的创始人之一Dan Abramov,他也创建了Normalizr。 –

相关问题