2017-07-05 68 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

你可以使用Array.prototype.findObject.entries

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

記住BTW保持這種迭代的鑰匙上的順序是不能保證。因此,假設您想要查找大於值的第一個標籤,則需要對標籤進行排序。

+0

偉大的建議,也關於排序。我是否正確,Object.entries處於Draft狀態,因此不推薦在生產應用程序中使用?沒有實驗語言功能還有另一種方法嗎? – Gegenwind

+0

@ user2672106有[polyfill可用](https://github.com/es-shims/Object.entries)。你也可以遍歷鍵'this.state.labels [Object.keys()。find()]'當然你可以使用babel來傳遞你的代碼:) –

+0

感謝您的幫助,Yury! – Gegenwind

0

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

像這樣更加簡潔。有沒有理由需要在這裏使用Object.keys()?這很慢。

無論如何,我在開頭添加了變量聲明和解構。