2017-07-05 12 views
0

この質問は作業コードの改善についてです。私は値をとり、オブジェクトを反復し、その値をオブジェクトのキーと比較することによってどのラベルを返すかを定義する関数showLabelsを持っています。条件付き矢印関数オブジェクトの反復

showLabels = (value) => { 
    Object.keys(this.state.labels).forEach(key => { 
     if (value <= key) this.tooltip = this.state.labels[key]; 
    }); 
    return this.tooltip; 
    } 

質問:これをより簡潔にすることは可能ですか?特に関数の値をthis.tooltipに代入し、それを外部関数で返すことは不必要に冗長に思えます。ここでのコメントに基づいて

は一例です。このような

this.state.labels = {0: "Smallest amount", 50: "In the middle", 100: "Top"} 
value = 33 
//showLabels(value=33) should return "In the middle" 
+0

あなたは私たちとその実行例を表示することができますか?好きなもの、値とラベルは何ですか –

+0

確かに、私は質問に追加しました。 – Gegenwind

答えて

2

あなたはところで、キーに対する反復の順序が保証されていないことを心に留めておくObject.entries

showLabels = value => Object.entries(this.state.labels) 
 
          // sort pairs by key 
 
          .sort(([keyA], [keyB]) => keyA > keyB) 
 
          .find(([key]) => key > value)[1] 
 

Array.prototype.findを使用することができます。だから、値より大きい最初のラベルを見つけたいと思えば、ラベルをソートする必要があります。

+0

大きなアドバイス、ソートについても。 Object.entriesがDraft状態であるため、本番アプリケーションで使用することはお勧めできません。実験的な言語機能がない別の方法がありますか? – Gegenwind

+0

@ user2672106 [polyfill available](https://github.com/es-shims/Object.entries)があります。また、 'this.state.labels [Object.keys()。find()]'キーを繰り返し処理することもできます。もちろん、あなたはバベルを使ってコードをトランスクリライズすることができます:) –

+0

あなたの助けに感謝、ゆり! – Gegenwind

0

showLabels = (value) => { 
 
    let tooltip, { labels } = this.state 
 
    Object.keys(labels).forEach(key => { 
 
    if (value <= key) tooltip = labels[key]; 
 
    }) 
 
    return tooltip; 
 
}

何かがより簡潔です。ここにObject.keys()を使用する理由はありますか?むしろ遅いです。

とにかく、始めに可変宣言と構造解除を追加しました。

関連する問題