2017-12-17 22 views
0

새 필터를 선택하는 것이 좋습니다. 목록을 필터링하려고 시도 할 때까지 지금까지 셀렉터를 만드는 데 성공했습니다. 중첩 된 키 값 쌍 대부분의 옵션은 문자열 또는 문자열 배열이며 제대로 작동하지만 객체의 true/false 값으로이 목록을 필터링하는 방법을 알 수 없습니다. 여기 배열을 필터링하고 중첩 된 객체에 true 값이 포함되어 있는지 확인하는 방법

지금까지 내 작업의 선택이며, 나는 그것을 사용하고 json으로는

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 
    } 
    } 
) 

를 정렬하고이

"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" 
    }, 

내 질문 인 JSON 어떻게 할에서 단일 항목입니다 "maps"객체를 필터링하고 true 값을 가진 항목을 반환합니까? 이게 도움이된다면. {11 : TRUE} 그래서

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 
    } 
    } 
) 

같은이 솔루션을 제공 할 수있는 충분한 코드가없는 경우 "지도"- 제가 원래 선택에 추가 할 것은 'SHOW_SUMMONERS_RIFT'입니다. 알려 주시면 더 관련성이 있다고 생각되는 것을 게시 할 수 있습니다. 또는 어딘가에 문서가있는 경우 더 자세히 읽어야합니다 ... 발견 한 모든 것은 중첩 된 개체를 업데이트하는 것이고 값을 비교하는 것에 대해서는 찾을 수 없습니다. 제발, 고마워요.

해결책 --- 나를 올바른 경로에두기위한 Hardik Modha 덕택입니다. 이것이 최선의 솔루션인지 또는 재 선택, Redux 또는 일반 자바 스크립트 하하를 사용하는 좋은 방법인지는 모르겠지만, 여기에 나와있는 경우가 있으며 중첩 된 객체를 기반으로 한 선택기에서 작동합니다.

Object.entries를 사용

답변

3

는 당신은 첫째 Object.keys 를 사용하여 모든 항목을 가져온 다음 사용하여 진정한 가치가있는 항목을 필터링해야 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

const로 맵 객체를 설정할 수 없습니다. 이것은 맵 객체의 변형이 다른 100 개의 항목이있는 배열의 단일 항목 일뿐입니다. 또는 나는 당신의 대답을 오독하고 있는가? 나는 앞으로 몇 분 동안 모바일에있다. 나는 당신의 대답에 대한 답변으로 몇 가지 몇 가지를 추가 할 것입니다. –

+0

코드 스 니펫을 업데이트했습니다. 희망이 도움 : –

+1

안녕하세요, 고마워요. 방금 내 대답을 기반으로 작업 코드를 게시하고 올바른 것으로 응답을 표시합니다. 다시 한 번 감사드립니다. –

0

당신은 당신의 1036.maps를 조작 할 필요가

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 
...

() 문서에서

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries 예. 당신을 위해

const obj = { 0: 'a', 1: 'b', 2: 'c' }; 
console.log(Object.entries(obj)); // [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ] 

예 ...

let workableData = Object.entries(1036.maps) 

workableData.map(ele => { ele[1] === true ? do this : do this })