2017-09-08 4 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"] 
} 

Dans l'exemple ci-dessus, y a-t-il une raison pour laquelle mon besoin de l'inclure api l'inclut. Je suppose que de cette façon vous pouvez faire un compte plus rapidement, vous pouvez probablement trier mais généralement je ne comprends pas s'il y a un coup de performance.Pourquoi un tableau de tous les `ids 'est-il nécessaire dans une forme d'état normalisée?

+1

D'où vient cette exigence? Ce n'est certainement pas une chose JavaScript ou Réagir. Je ne peux pas parler pour Redux. –

+0

Ce n'est pas une exigence de Redux non plus. – Nit

+2

Je l'ai vu dans plusieurs questions. Apparemment c'est comment Dan Abramov le fait dans ce tutoriel: https://egghead.io/lessons/javascript-redux-normalizing-the-state-shape – jonahe

Répondre

5

Ce n'est pas quelque chose qui est requis par Redux, c'est une chose normalizr. Pour répondre à votre question, les objets JavaScript can't be replied upon to retain sort order in certain situations. Mettre les identifiants dans un tableau vous permet de conserver l'ordre de tri qui existait avant la normalisation.

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

En ce qui concerne les tableaux ID, alors que les moteurs JS ont maintenant un processus assez standardisé pour itérer à travers les clés dans un objet, vous ne devriez pas compter sur cela pour définir la commande. Le stockage de tableaux d'ID vous permet de définir une commande pour les articles.

+2

* "Pour répondre à votre question, les objets JavaScript ne garantissent pas l'ordre dans lequel propriétés apparaissent. "* Oui, ils le font, à partir de ES2015, voir [ici] (http://www.ecma-international.org/ecma-262/8.0/index.html#sec-ordinaryownpropertykeys) et [ici] (http://www.ecma-international.org/ecma-262/8.0/index.html#sec-enumerate-object-properties) et l'explication d'Oriol [ici] (https://stackoverflow.com/a/30919039/157247). Les nouvelles opérations ajoutées dans ES2015 et 'JSON.stringify' suivent la commande. Les opérations héritées ('Object.keys',' for-in') ne sont pas obligatoires. Mais ** JSON ** n'a pas d'ordre de propriété. :-) –

+0

normalizr a été créé en 2014, les applications React peuvent être utilisées dans les anciens navigateurs comme IE 9, normalizr ne retourne pas JSON donc le manque d'ordre de propriété de JSON n'est pas pertinent ici, les spécifications ne nécessitent pas d'ordre de tri lors de l'énumération sur vos données (ce qui est extrêmement commun dans les applications React), et l'auteur de la bibliothèque mentionne explicitement l'ordre de tri non fiable comme son raisonnement [ici] (https://stackoverflow.com/questions/42238802/redux-many-to-many -relationship/42257112? noredirect = 1 # comment71675068_42257112) Je vais changer à "ne peut pas compter sur pour conserver" correction –

+0

: Mark a écrit la [Forme d'état de normalisation] (http://redux.js.org/ docs/recipes/reducers/NormalizingStateShape.html) doc pour Redux et est un co-mainteneur de Redux avec son créateur, Dan Abramov, qui a également créé Normalizr. –