2017-11-07 21 views
0

私は選択されたキーが選択されているかどうかにかかわらず、季節オブジェクトとselectedSeasonIdsを保持します。オブジェクトから選択したオブジェクトを見つける方法

パフォーマンスを向上させるために、配列をオブジェクトデータ構造にリファクタリングしています。

私は

seasons = {30: 'Fall', 31: 'Spring', 32: 'All'} 

selectedSeasonIds = {30: true, 31: false, 32: true} 

let output = selectedSeasonIds.???? 
// {30: 'Fall', 32: 'All'} <- This is my goal 

これらのデータを持っている間、私は私が選択したオブジェクトを選択するためのセレクタを使用ONLY選択したシーズンをレンダリングします。しかし、私はそれを使用する利点はありません。私のコードを使用するか、より良いものを作成してください。ここにコードのスニペットがあります

私のセレクタです。

const getSeasons = (seasons, selectedSeasonIds) => { 
    const selectedSeasons = _.filter(
    seasons, 
    season => _.includes(selectedSeasonIds, season.id) 
); 
    return selectedSeasons; 
} 

私は、セレクタから

selectedSeasons = SelectedSeasonsSelector(this.state) << getting selector 
if(selectedSeasons.length==0) { 
    return '-' 
} 
let seasonList = selectedSeasons.map((season) => { 
    return ' '+season.value; 
}) 
return seasonList 

感謝を選択したオブジェクトを取得しています!

+0

なぜオブジェクトのルックアップは、アレイのルックアップよりもパフォーマンスのでしょうか? – Teemu

+0

オブジェクトのルックアップはアレイのルックアップよりもはるかに高速です。遅く触れる不透明の問題がありました。うまくいけば、リファクタリングの後に問題を解決します:) –

+0

私はそれが速くないと確信していますが、JSでもすべて可能です。 – Teemu

答えて

1

あなたはarray#reduceを使用してのみselectedSeasonIdstrueを持っている出力でこれらの値を追加するための条件を置くことができます。

const seasons = {30: 'Fall', 31: 'Spring', 32: 'All'}; 
 
const selectedSeasonIds = {30: true, 31: false, 32: true}; 
 
let output = Object.keys(selectedSeasonIds).reduce((r,k) => { 
 
    if(selectedSeasonIds[k]) 
 
    r[k] = seasons[k] || ''; 
 
    return r; 
 
}, {}); 
 
console.log(output);

+1

ありがとうございました。非常に良いアイデア。 –

+0

あなたはrが何であるか説明できますか? –

+1

'r'はキー値を格納するアキュムレータオブジェクトです。 'k'は' selectedSeasonIds'のキーです。 –

0

オブジェクト内のキーは、アクセス特性であるので、同様に得ことができる。

その後
selectedSeasonIds = {30: true, 31: false, 32: true} 
Object.keys(selectedSeasonIds); //Gets an array of keys 
for (let key in selectedSeasonIds){//Iterate through the keys}; 

選択された季節にアクセスするのは簡単であるべきです。

+0

あなたのご意見ありがとうございますが、完全な答えと考えるのは難しいです。 –

関連する問題