2016-11-28 38 views
6

可以說我有將所有對象鍵爲false

filter: { 
    "ID": false, 
    "Name": true, 
    "Role": false, 
    "Sector": true, 
    "Code": false 
    } 

我想所有鍵設置爲false(重置它們)的對象。最好的辦法是什麼,我想避免與foreach和東西循環。任何整齊的一班?

+0

感謝,請寫一個答案! – chefcurry7

+0

這個怎麼樣,如果你已經處理了'filter',那麼'filter:{}'? – Aruna

回答

10

使用lodash,mapValues是一個優美,無環路的方式:

filter = { 
    "ID": false, 
    "Name": true, 
    "Role": false, 
    "Sector": true, 
    "Code": false 
}; 

filter = _.mapValues(filter,() => false); 

如果你想用Underscore.js做這件事,有一個等價的,但名稱略有不同:

filter = _.mapObject(filter,() => false); 

在任一情況下,filter值將被設置爲:

{ ID: false, 
    Name: false, 
    Role: false, 
    Sector: false, 
    Code: false } 
+0

謝謝你。一個問題,如果我想獲得具有「真實」價值的財產(任何時候只有一個),那麼最好如何做到這一點? – chefcurry7

+0

示例數據表明斷言一次只有一個屬性爲「真」。但不管多少,'_.keys(filter).filter(k => filter [k])'會給你一個快捷的數組,給所有真值的鍵。如果你想要嚴格的布爾值,你可以使用「true」的確切等價。你總是可以索引結果數組來得到第一個數組:'_.keys(filter).filter(k => filter [k])[0]'。如果沒有,則返回'undefined'。對不起,該表達式中有三個「過濾器」實例,但您的變量名稱會重載函數名稱。 –

+0

@ chefcurry7您可能還喜歡'_.find(_。keys(filter),k => filter [k])'。它的工作原理類似,但略短。 –

15

那麼這裏是一個一行香草JS:

Object.keys(filter).forEach(v => filter[v] = false) 

它確實使用與.forEach()方法的隱含的循環,但你必須循環這樣或那樣的(除非你通過更換復位整個對象與硬編碼的默認對象文字)。

+2

糾正我,如果我錯了,但不能這樣做**沒有**循環。不確定OP是否理解這一點。 –

+0

@CarlEdwards,這是很好的卡爾。我沒有意識到箭頭函數是有用的。 – chefcurry7

+0

即使沒有箭頭功能,它仍然非常短,如在其他答案。 – nnnnnn

6

如果你不使用ES6,這裏是ES5的對應部分。

Object.keys(filter).forEach(function(key, value) { 
    return filter[key] = false; 
}) 
0

一小行代碼兼容所有瀏覽器:

for(var i in your_object) your_object[i] = false; 
1

hasOwnProperty必須使用

```

for(var i in your_object) { 
    if (Object.hasOwnProperty.call(your_object, i)) { 
    your_object[i] = false; 
    } 
} 

```

相關問題