2017-12-17 6 views
0

Ich bin neu zu wählen und ich hatte Erfolg mit der Erstellung von Selektoren so weit, bis ich versuchte, eine Liste zu filtern ein geschachteltes Schlüsselwertpaar. Die meisten Optionen sind Strings oder Array von Strings und sie funktionieren gut, aber ich kann nicht herausfinden, wie diese Liste durch die Wahr/Falsch-Werte in einem Objekt gefiltert wird.wie durch ein Array zu filtern und zu überprüfen, ob ein verschachteltes Objekt einen Wert von True enthält erneut in redux

hier ist mein Arbeits Wähler so weit und die json ich bin mit

const getItemsVisibilityFilter = state => state.itemsVisibilityFilter 
const getItems = state => state.items 

export const getVisibleItems = createSelector(
    [getItemsVisibilityFilter, getItems], 
    (itemsVisibilityFilter, items) => { 
    switch (itemsVisibilityFilter) { 
     case 'SHOW_ALL': 
     console.log(items) 
     return items 
     case 'SHOW_DAMAGE': 
     return items.filter(item => item.tags.includes('Damage')) 
     case 'SHOW_ATTACK_SPEED': 
     return items.filter(item => item.tags.includes('AttackSpeed')) 
     case 'SHOW_LIFE_STEAL': 
     return items.filter(item => item.tags.includes('LifeSteal')) 
     default: 
     return items 
    } 
    } 
) 

und dies ist ein einzelnes Element aus der JSON

"1036": { 
     "stats": { 
      "FlatPhysicalDamageMod": 10 
     }, 
     "description": "<stats>+10 Attack Damage</stats>", 
     "gold": { 
      "total": 350, 
      "sell": 245, 
      "base": 350, 
      "purchasable": true 
     }, 
     "tags": [ 
      "Damage", 
      "Lane" 
     ], 
     "plaintext": "Slightly increases Attack Damage", 
     "image": { 
      "full": "1036.png", 
      "group": "item", 
      "sprite": "item0.png", 
      "h": 48, 
      "w": 48, 
      "y": 48, 
      "x": 48 
     }, 
     "sanitizedDescription": "+10 Attack Damage", 
     "maps": { 
      "8": true, 
      "10": true, 
      "11": true, 
      "12": true, 
      "14": false, 
      "16": false, 
      "18": true, 
      "19": true 
     }, 
     "into": [ 
      "3077", 
      "3123", 
      "1053", 
      "3155", 
      "3134", 
      "3133", 
      "3034", 
      "3035", 
      "3044", 
      "3052", 
      "3072", 
      "3122", 
      "3144", 
      "3252" 
     ], 
     "id": 1036, 
     "name": "Long Sword" 
    }, 

meine Frage ist zu klären, wie ich tun Durch das Objekt "maps" filtern und die Elemente mit dem Wert true zurückgeben? Wenn das hilft. was ich möchte den ursprünglichen Selektor hinzuzufügen ist ‚SHOW_SUMMONERS_RIFT‘ - „Karten“: {11: true} wie so

const getItemsVisibilityFilter = state => state.itemsVisibilityFilter 
const getItems = state => state.items 

export const getVisibleItems = createSelector(
    [getItemsVisibilityFilter, getItems], 
    (itemsVisibilityFilter, items) => { 
    switch (itemsVisibilityFilter) { 
     case 'SHOW_ALL': 
     console.log(items) 
     return items 
     case 'SHOW_DAMAGE': 
     return items.filter(item => item.tags.includes('Damage')) 
     case 'SHOW_ATTACK_SPEED': 
     return items.filter(item => item.tags.includes('AttackSpeed')) 
     case 'SHOW_LIFE_STEAL': 
     return items.filter(item => item.tags.includes('LifeSteal')) 
     case 'SHOW_SUMMONERS_RIFT': 
     return items.filter(item => item.maps.includes(I don't know what or to put here to see if 11 === true)) 
     default: 
     return items 
    } 
    } 
) 

Ist dies nicht genug Code ist eine Lösung bieten zu können. Bitte lass es mich wissen und ich kann alles posten, was deiner Meinung nach relevanter ist. Oder wenn es irgendwo Dokumente gibt, die ich lesen sollte ... Alles was ich gefunden habe, ist das Aktualisieren verschachtelter Objekte und ich kann nichts über den Vergleich von Werten finden. bitte und danke

LÖSUNG --- Danke an Hardik Modha, dass er mich auf den richtigen Weg gebracht hat. Ich weiß nicht, ob dies die beste Lösung oder sogar eine gute Möglichkeit für die Verwendung von Reselect, Redux, oder einfach Javascript ist haha, aber hier ist der Fall, den ich kam und es funktioniert für den Selektor basierend auf einem verschachtelten Objekt

case 'SHOW_SUMMONERS_RIFT': 
    const riftItems = items.filter(item => { 
     const mapKey = Object.keys(item.maps) 
     const mapValue = Object.values(item.maps) 
     if (mapKey[2] && mapValue[2] === true) { 
     return item 
     } 
     return null 
    }) 
    return riftItems 

Antwort

3

Sie müssen nur alle Einträge zuerst Object.keys mit bekommen und dann die Einträge filtern, die Wert werden wahr mit filter

const filtered = Object.keys(map.maps).filter((item) => map.maps[item]);

const myObject = { 
 
    "1036": { 
 
     "maps": { 
 
      "8": true, 
 
      "10": true, 
 
      "11": true, 
 
      "12": true, 
 
      "14": false, 
 
      "16": false, 
 
      "18": true, 
 
      "19": true 
 
     }, 
 
    }, 
 
    "1037": { 
 
     "maps": { 
 
      "8": false, 
 
      "10": true, 
 
      "11": true, 
 
      "12": false, 
 
      "14": false, 
 
      "16": false, 
 
      "18": true, 
 
      "19": true 
 
     }, 
 
    }, 
 
    "1038": { 
 
     "maps": { 
 
      "8": true, 
 
      "10": false, 
 
      "11": true, 
 
      "12": true, 
 
      "14": false, 
 
      "16": false, 
 
      "18": false, 
 
      "19": true 
 
     }, 
 
    }, 
 
} 
 

 
Object.keys(myObject).forEach((key) => { 
 
    const maps = myObject[key].maps; 
 
    console.log(Object.keys(maps).filter(item => maps[item])); 
 
});

+0

Ich kann das maps -Objekt nicht auf eine Konstante setzen. Da es sich um ein einzelnes Element aus einem Array mit 100 Elementen handelt, die alle unterschiedliche Variationen des Kartenobjekts aufweisen. Oder irre ich nur deine Antwort? Ich bin für die nächsten paar Minuten mobil. Ich werde hinzufügen, was ich als Antwort auf Ihre Antwort in ein paar Minuten versucht habe. –

+0

Ich habe das Code-Snippet aktualisiert. Hoffe es hilft :) –

+1

Hey, vielen Dank. Ich habe gerade meinen Arbeitscode basierend auf deiner Antwort gepostet und ich markiere deine Antwort als richtig. Danke noch einmal –

Verwandte Themen