3

有没有更好的方法来获取对象的键和值?我试图在没有for循环的情况下做到这一点。

obj = { collection: 'foo' }

for key, value of obj
  console.log key, value

如果一个对象有一个键和一个值,我认为可能有一种更有效的方法来做到这一点。不过我可能是错的。

4

1 回答 1

2

如果您只想检查一个对象是否只有一个键,那么您可以使用短路循环:

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)循环来开始计算对象中键的数量。我们只关心三种情况:

  1. 少于一个键(即null或没有键)。初始null检查和how_many = 0初始化会处理这个问题。
  2. 只有一把钥匙。在这种情况下,循环将通过一次,++how_many一旦离开就会被击中how_many == 1
  3. 有不止一个键。在这种情况下,由于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/

于 2012-06-07T02:44:18.110 回答