2016-04-19 9 views
2

私の変更できないマップの特定の部分に特定のキー値が含まれているかどうかを確認しようとしています(checked: true)。私はオーバー探していたオブジェクトは、そのようになっていますimmutablejs:マップにキー値が含まれているかどうかを調べる

const memo = { 
    "Topics": { 
    "filters": { 
     "Psychological disorders": { 
     "filters": { 
      "Anxiety disorders": { 
      "filters": {}, 
      "checked": true <-- check for this value at this level 
      } 
     } 
     } 
    }, 
    "isOpen": false 
    } 
} 

注:このデータは、実際に不変です。

機能が走った後だから、これに変更します

const memo = { 
     "Topics": { 
     "filters": { 
      "Psychological disorders": { 
      "checked": true, <-- check true added 
      "filters": { 
       "Anxiety disorders": { 
       "filters": {}, 
       "checked": true 
       } 
      } 
      } 
     }, 
     "isOpen": false 
     } 
    } 

私は今へのアクセス権を持っている唯一のvarはので、私はいずれかがあるかどうかを確認しようとしています何を、「トピック」の名前でありますトピック - >フィルタ - >フィルタにはchecked: trueが含まれています。最初は、私はこのメモをtoJSして、lodashで内部をチェックしようとしていました。このような

何か:

_.find(memo['Topics'], _.flow(
    _.property('filters'), 
    _.property('filters'), 
    _.partialRight(_.any, { checked: true }) 
)); 

私は、オブジェクトを変更するには、この情報を使用することができますが、不変の外にそれを取ることなく、これを達成することが可能である場合、私は疑問に思って。これまで私はこれを試しました:

const nameCheck = 'Topics'; 

    const hasCheckedFilters = memo.update(nameCheck, Map(), 
     (oldResult) => oldResult.update('filters', Map(), 
      (oldSection) => { 
       // filters inside this object has checked : true, .set('checked', true); 
       const fromImmutable = oldSection.toJS(); 
       const checkForChecked = _.find(fromImmutable.filters, {checked:true}); 
       if(checkForChecked) { 
        oldSectsion.set('checked', true); 
       } 

       } 
      ) 
     ) 
    ); 

私はフィルタをループしていないので、これは動作していないようです。入力を感謝します、ありがとう!

答えて

1

これはデータを不変に保ちます。私は、Topics.filtersの各プロパティをループして、そのプロパティにfiltersキーがあるかどうかを確認しています。それがループする場合。サブアイテムでチェックされている場合は、親アイテムでcheckedをtrueに設定し、新しいマップを返します。

const memo = { 
     "Topics": { 
     "filters": { 
      "Psychological disorders": { 
      "checked": false, 
      "filters": { 
       "Anxiety disorders": { 
       "filters": {}, 
       "checked": true 
       } 
      } 
      } 
     }, 
     "isOpen": false 
     } 
    }; 

let map = Immutable.fromJS(memo); 

map.getIn(['Topics','filters']).forEach((item, i) => { 
    if(item.has('filters')){ 
    item.get('filters').forEach(subItem => { 
     if(subItem.get('checked') === true){ 
     map = map.setIn(['Topics', 'filters', i], item.set('checked', true)); 
     } 
    }); 
    } 
}); 

console.log(JSON.stringify(map.toJS())); 

http://jsbin.com/gorohewuji/edit?js,console

+0

おかげで非常に多く、非常に役立ちます。 – ajmajmajma

+0

1つのアップデートでこれを行う方法はありますか?私はこれに連鎖して新しいメモを返す必要がある他の更新があります。私はここで新しい質問をしましたhttp://stackoverflow.com/questions/36746377/immutable-update-inside-map-not-returning-correct-objectあなたの助けをもう一度ありがとう! – ajmajmajma

関連する問題