有没有更好的方法来获取对象的键和值?我试图在没有for
循环的情况下做到这一点。
obj = { collection: 'foo' }
for key, value of obj
console.log key, value
如果一个对象有一个键和一个值,我认为可能有一种更有效的方法来做到这一点。不过我可能是错的。
有没有更好的方法来获取对象的键和值?我试图在没有for
循环的情况下做到这一点。
obj = { collection: 'foo' }
for key, value of obj
console.log key, value
如果一个对象有一个键和一个值,我认为可能有一种更有效的方法来做到这一点。不过我可能是错的。
如果您只想检查一个对象是否只有一个键,那么您可以使用短路循环:
exactly_one = (obj) ->
return false if(!obj)
how_many = 0
for own key of obj
break if(++how_many == 2)
how_many == 1
基本思想是使用for ... of
(即 JavaScript 的for ... in
)循环来开始计算对象中键的数量。我们只关心三种情况:
null
或没有键)。初始null
检查和how_many = 0
初始化会处理这个问题。++how_many
一旦离开就会被击中how_many == 1
。break
. 我们知道只要false
遇到第二个键就会得到结果,因此无需继续计数。该函数将最多进行两次循环迭代。这仍然是一个循环,但没有规则强制您在不需要时运行整个循环,您总是break
可以早点退出。
演示:http: //jsfiddle.net/ambiguous/qsNMA/
对逻辑的细微调整会给你“最多一个”、“至少一个”等。
如果您不是天生的 C 程序员,那么您可以稍微展开逻辑:
for own key of obj
++how_many
break if(how_many == 2)
你也可以这样写:
(break if(++how_many == 2)) for own key of obj
但这正在推动它IMO。
这些own
东西只是添加了hasOwnProperty
检查以避免意外地从原型中抓取东西。你可能不需要那个,但既然他们真的要抓到我,我宁愿谨慎行事。
还有Object.keys
,但这不是普遍支持的,当你只关心它的长度是否为 1 时,它必须构建一个完整的数组:
exactly_one = (obj) ->
return false if(!obj)
Object.keys(obj).length == 1
演示:http: //jsfiddle.net/ambiguous/aH8wA/