2016-07-08 13 views
0
{ 
      '1': { 
       id: 1, 
       parent_id: 0, 
       elementType: 'view', 
       style: {color: 'green'}, 
       selected: false, 
       childIds: [2] 
      }, 
      '2': { 
       id: 2, 
       parent_id: 1, 
       elementType: 'text', 
       style: {color: 'green'}, 
       selected: true, 
       childIds: [] 
      } 

}Redux ES6 (BabelJS): Gibt es eine Map-Funktion, die diese Struktur iterieren kann?

Es ist für ein Untersetzungsgetriebe und ich würde gerne in der Lage sein, dies zu tun:

obj.map(([key, value])=> { 
    if (value.id === 1) { 
     return {...value, selected:false}; 
    } else { 
     return value; 
    } 
}); 

Ich dachte, vielleicht this verwenden, aber es wird wahrscheinlich nicht gut spielen mit redux Mapping .

UPDATE:

Im Anschluss an die Empfehlung hier habe ich versucht, eine neue Map-Funktion zu bauen. Diese Version ist, was ich kam mit:

const map = (object, callback) => { 
    return Object.keys(object).reduce(function(output, key) { 

     output[key] = callback.call(this, object[key]); 

     return output; 
    }, {}); 
} 

Und ich versuche es so (ein Beispiel) zu verwenden:

let newState = map(oldState, element => { 
    if (element.id === 1) { 
     return {...element, selected:false}; 
    } else { 
     return {...element}; 
    } 
}); 

Inzwischen sind die Tests sind vorbei.

+1

Sie es eine 'length' Eigenschaft geben kann und' apply() '' [] .map() ', oder Ihre eigene Version der Karte schreiben(). sieht aus wie ein guter Anwendungsfall für 'for-of' obwohl ... – dandavis

+0

Ich schreibe Tests. schreibt meine eigene Kartenversion einen guten Ansatz für Tests? – Guy

+0

imho, es spielt keine Rolle, woher der getestete Code kommt, wie er testet. Sie können auch ein einfaches Werkzeug verwenden, um ein Objekt von Objekten in ein Array von Objekten zu verwandeln, und dann alles auf diesem realen Array verwenden. – dandavis

Antwort

1

Probieren Sie es mit Object.keys() aus, damit Sie Objektschlüssel durchlaufen können. Auf diese Weise können Sie auf bestimmte Werte zugreifen.

+0

das funktioniert, aber es ist eine Menge Boilerplate, um Werte zu ziehen ... – dandavis

+0

Ich suche eine Map- Wie Methode, um ein neues Objekt zurückzugeben, wie ich einen newState für Redux zurückgeben möchte – Guy

1

Sie können versuchen, Object.entries zu verwenden. Es ist immer noch ein Vorschlag, aber ich denke, dass es bereits hinter einer babel-Bühnenflagge versteckt ist.

for (const [key, value] of Object.entries(obj)) { 
    //do whatever you want 
} 

ES proposal: Object.entries() and Object.values()

+0

Ich bin auf der Suche nach einer Map-ähnliche Methode, um ein neues Objekt zurückzugeben, da ich einen neuen Status für Redux zurückgeben möchte, weshalb ich reduzieren verwendet – Guy