2016-11-28 70 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; 
    } 
} 

```

相关问题