2017-07-30 44 views
1

使用後normalizr庫我在我的應用程序的終極版聲明如下規範化JSON對象結果:如何過濾沒有數組的標準化嵌套JSON數據?

{ 
    sports: { 
     byId: { 
      1: { 
      id: 1, 
      name: 'Soccer', 
      slug: 'soccer' 
      }, 
      2: { 
      id: 2, 
      name: 'Basketball', 
      slug: 'basketball' 
      }, 
      3: { 
      id: 3, 
      name: 'American Football', 
      slug: 'american-football' 
      } 
     }, 
     allIds: [ 
      '1', 
      '2', 
      '3' 
     ] 
     }, 
     competitions: { 
     byId: { 
      '1': { 
      id: 1, 
      name: 'Competition 1', 
      short_name: 'Comp 1', 
      slug: 'comp-1', 
      sport: 1, 
      status: { 
      is_live: false 
      } 
      }, 
      '2': { 
      id: 2, 
      name: 'Competition 2', 
      short_name: 'Comp 2', 
      slug: 'comp-2', 
      sport: 1, 
      status: { 
      is_live: true 
      } 
      }, 
      '3': { 
      id: 3, 
      name: 'National Basketball League', 
      short_name: 'NBA', 
      slug: 'national-basketball-league', 
      sport_slug: 'basketball', 
      sport: 3, 
      status: { 
      is_live: true 
      } 
      } 
     }, 
     allIds: [ 
      '1', 
      '2', 
      '3' 
     ] 
    } 

我想達到什麼:我想過濾的competitions列表/由sports分類。

我該怎麼做?

另外我希望能夠通過組competitions它的status.is_live

那麼,如何可以通過sportstatus.is_live等於真實competitionsstatus.is_live得到competitions擊穿的名單等於假的?

任何幫助表示讚賞!謝謝

回答

0

如果你不想使用lodash,你可以很容易地編寫一個.groupBy函數(example)。您需要遍歷輸出對象,並使用for而不是使用.mapValues來重新分配其子值。

我在示例中使用了lodash,只是爲了指出邏輯。

注:我刪除分組在原始響應中的數據,並讓客戶做到這一點對自己 - 這是更容易的排序的數組和過濾器上工作/圖,而不是工作針對來自具有冗餘鍵(因爲它們代表組由Id)的對象的值

let data = { 
 
    sports: { 
 
    byId: { 
 
     1: { 
 
     id: 1, 
 
     name: 'Soccer', 
 
     slug: 'soccer' 
 
     }, 
 
     2: { 
 
     id: 2, 
 
     name: 'Basketball', 
 
     slug: 'basketball' 
 
     }, 
 
     3: { 
 
     id: 3, 
 
     name: 'American Football', 
 
     slug: 'american-football' 
 
     } 
 
    }, 
 
    allIds: [ 
 
     '1', 
 
     '2', 
 
     '3' 
 
    ] 
 
    }, 
 
    competitions: { 
 
    byId: { 
 
     '1': { 
 
     id: 1, 
 
     name: 'Competition 1', 
 
     short_name: 'Comp 1', 
 
     slug: 'comp-1', 
 
     sport: 1, 
 
     status: { 
 
      is_live: false 
 
     } 
 
     }, 
 
     '2': { 
 
     id: 2, 
 
     name: 'Competition 2', 
 
     short_name: 'Comp 2', 
 
     slug: 'comp-2', 
 
     sport: 1, 
 
     status: { 
 
      is_live: true 
 
     } 
 
     }, 
 
     '3': { 
 
     id: 3, 
 
     name: 'National Basketball League', 
 
     short_name: 'NBA', 
 
     slug: 'national-basketball-league', 
 
     sport_slug: 'basketball', 
 
     sport: 3, 
 
     status: { 
 
      is_live: true 
 
     } 
 
     } 
 
    }, 
 
    allIds: [ 
 
     '1', 
 
     '2', 
 
     '3' 
 
    ] 
 
    } 
 
} 
 

 
let competitions = Object.values(data.competitions.byId) 
 

 
// _.chain(arr) keeps returning `lodash` objects 
 
// so I don't have to call it separately for every action 
 
let filteredCompetitions = _.chain(competitions) 
 
    .groupBy(i => i.status.is_live) 
 
    .mapValues(i => _.groupBy(i, 'sport')) 
 
    .value() // returns the final value 
 
    
 
console.log(filteredCompetitions)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+0

感謝你的幫助。我嘗試過這一點,我認爲它沒有關於「運動」的狀態/ is_live參考。 '讓filteredCompetitions = _.chain(比賽) .groupBy( '​​運動') 。價值() //返回最終值 _.forEach(filteredCompetitions,函數(價值,鍵){ filteredCompetitions [ key] = _.groupBy(filteredCompetitions [key],function(item){ return item.status.is_live; }); }); console.log(filteredCompetitions)' 也許有更優雅的方式來做到這一點? –

+0

檢查更新後的答案 – casraf