Staat als array von Objekten vs Objekt-sortiert nach id

In dem Kapitel über Die Gestaltung der Staatlichen Form, die docs vorschlagen, um zu halten Ihren Zustand in ein Objekt sortiert nach ID:

Halten jede Person, die in einem Objekt gespeichert mit einer ID als Schlüssel, und verwenden Sie IDs, um diese zu referenzieren von anderen Personen oder Listen.

Sie gehen zu Zustand

Denken, die app ist-Zustand als eine Datenbank.

Arbeite ich an der staatlichen Form für eine Liste von filtern, von denen einige offen sein (Sie sind angezeigt in einem popup-Fenster), oder haben Sie die gewählten Optionen. Wenn ich lese "Denke an die app' s Zustand als eine Datenbank," ich dachte darüber nach, denken Sie als eine JSON-Antwort, wie es wäre, zurück von einem API (selbst-unterstützt durch eine Datenbank).

Also dachte ich mir, es als

[{
    id: '1',
    name: 'View',
    open: false,
    options: ['10', '11', '12', '13'],
    selectedOption: ['10'],
    parent: null,
  },
  {
    id: '10',
    name: 'Time & Fees',
    open: false,
    options: ['20', '21', '22', '23', '24'],
    selectedOption: null,
    parent: '1',
  }]

Aber die docs vorschlagen, ein format mehr, wie

{
   1: { 
    name: 'View',
    open: false,
    options: ['10', '11', '12', '13'],
    selectedOption: ['10'],
    parent: null,
  },
  10: {
    name: 'Time & Fees',
    open: false,
    options: ['20', '21', '22', '23', '24'],
    selectedOption: null,
    parent: '1',
  }
}

In der Theorie, es sollte keine Rolle spielen, solange die Daten, die serialisierbar ist (unter der überschrift "Status").

Also ging ich mit der array-of-objects Ansatz glücklich, bis ich Schreibe meine reducer.

Mit der Objekt-keyed-by-id-Ansatz (und liberale Verwendung von spread-syntax), die OPEN_FILTER Teil der reducer wird

switch (action.type) {
  case OPEN_FILTER: {
    return { ...state, { ...state[action.id], open: true } }
  }

In der Erwägung, dass mit der array-of-objects Ansatz, es ist die ausführlichere (und Helfer-Funktion angewiesen)

switch (action.type) {
   case OPEN_FILTER: {
      //relies on getFilterById helper function
      const filter = getFilterById(state, action.id);
      const index = state.indexOf(filter);
      return state
        .slice(0, index)
        .concat([{ ...filter, open: true }])
        .concat(state.slice(index + 1));
    }
    ...

Also meine Fragen sind dreifach:

1) Ist die Einfachheit der reducer die motivation für den Gang mit dem Objekt-keyed-by-id-Ansatz? Gibt es andere Vorteile, die state-Form?

und

2) Es scheint, wie das Objekt-keyed-by-id-Ansatz macht es schwieriger, befassen sich mit standard-JSON-in/out für eine API. (Das ist, warum ich ging mit dem array von Objekten in den ersten Platz.) Also, wenn Sie gehen mit diesem Konzept, haben Sie nur eine Funktion verwenden, um es zu transformieren, hin und her zwischen JSON-format und Zustand-shape-format? Das scheint umständlich. (Obwohl, wenn Sie sich dafür einsetzen, dass ein Ansatz, der Teil Ihrer Argumentation, dass das weniger klobig als die array-of-objects reducer oben?)

und

3) ich weiß, Dan Abramov entwickelt redux zu theoretisch werden Staatliche Daten-Struktur Agnostiker (wie vorgeschlagen von "Durch die Konvention, die top-level-Zustand ist ein Objekt oder eine andere Schlüssel-Wert-collection wie eine Karte, aber technisch kann jede Art," Hervorhebung von mir). Aber angesichts der oben genannten, ist es nur "empfohlen" zu halten, ein Objekt sortiert nach ID, oder gibt es andere unvorhergesehene Schmerzen Punkte, die ich dabei bin zu laufen, mit einem array von Objekten, machen Sie es so, dass ich sollte nur Abbrechen, dass plan und versuchen, den Stab mit einem Objekt sortiert nach ID?

  • Dies ist eine interessante Frage, und eine, die ich hatte, nur einen Einblick zu gewähren, obwohl ich eher zu normalisieren, in der redux anstelle von arrays (rein, weil nachschlagen ist einfacher), ich finde, dass wenn man die normalisierten Ansatz Sortierung zu einem Problem, da Sie nicht die gleiche Struktur wie das array gibt Sie, so dass Sie gezwungen sind, Sortieren sich selbst.
  • Ich sehe ein problem in 'Objekt-keyed-by-id" - Ansatz, allerdings ist dies nicht häufigen, aber wir haben, diesen Fall zu prüfen, während das schreiben von UI-Anwendung. So was, wenn ich die Reihenfolge ändern möchten der Entität mittels einer drag & drop-element aufgelistet, die als geordnete Liste? In der Regel "Objekt-keyed-by-id' Ansatz versagt hier, und ich würde sicher gehen mit array von Objekt-Ansatz zu vermeiden, solche großzügigen Probleme. Es könnte noch mehr sein aber dachte, dass der Austausch dieses hier
  • Wie kann man Sortieren, ein Objekt aus Objekte? Dies scheint unmöglich.
  • Du meinst, neben der Verwendung von so etwas wie lodash ist sort_by? const sorted = _.sortBy(collection, 'attribute');
  • Ja. Derzeit wandeln wir die Objekte in arrays innerhalb einer vue berechnete Eigenschaft
InformationsquelleAutor nickcoxdotme | 2016-07-18
Schreibe einen Kommentar