我有設置一個JSON對象,類似這樣的東西:編輯JSON對象 - 尋找更好的功能計算策略
var settings = {
tab1: {
active: true,
selectOrder: 1,
selected: false
},
tab2: {
active: true,
selectOrder: 2,
selected: false
},
tab3: {
active: false,
selectOrder: 0,
selected: false
}
};
現在,我的目標是設置「中選擇」屬性爲「真」的具有最低'selectedOrder'的活動元素。在這個例子中,我應該爲'tab1'元素設置'selected'('tab3'的selectedOrder爲0,但不是活動的)。
它背後的原因是根據其優先級(selectOrder)選擇第一個活動選項卡。
我的解決辦法是:
function selectFirstActiveTab(visibilitySettings) {
var selected = 1000;
var answer = jQuery.extend({}, visibilitySettings);
Object.keys(answer).forEach((key) => {
if (answer[key].active && answer[key].selectOrder <= selected) {
selected = answer[key].selectOrder;
}
});
Object.keys(answer).forEach((key) => {
answer[key].selected = (answer[key].selectOrder === selected) ? true : false;
});
return answer;
};
雖然這種解決方案的工作,這似乎是一個糟糕的一個。
我的問題是:
是否有一個更好的 「函數式編程」 的方法呢? (例如使用map/reduce等)
我覺得我的設置對象結構不好。也許我應該選擇一個對象數組而不是這個JSON?選擇像這樣的JSON的原因是爲了更簡單地綁定到我的模板(類似於「{{settins.tab1.selected}}」 - 在我的html中查找它更簡單)。這裏應該是更好的方法?
Here is the complete example in JSBIN
您可以保留obj的最小值和ref,所以您只需要循環一次。 – fuyushimoya
是的,這兩個迭代是因爲我首先更新了selected = false。 –
_using map/reduce .._你**不能**使用Array的'map' /'reduce'方法,因爲你有對象而不是數組。我會建議你使用JS的可用性庫,如[Underscore](http://underscorejs.org/#objects)。 – hindmost