Coffeescript 如果没有for循环,如何从对象获取键和值?

Coffeescript 如果没有for循环,如何从对象获取键和值?,coffeescript,Coffeescript,是否有更好的方法获取对象的键和值?我尝试在不使用for循环的情况下执行此操作 obj = { collection: 'foo' } for key, value of obj console.log key, value 如果一个对象有一个键和一个值,我认为有一种更有效的方法可以做到这一点。但我可能错了。如果您只想检查对象是否只有一个键,则可以使用短路回路: exactly_one = (obj) -> return false if(!obj) how_many

是否有更好的方法获取对象的键和值?我尝试在不使用
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
基本思想是使用
来。。。循环中开始计算对象中的键数。我们只关心三个案例:

  • 少于一个键(即
    null
    或没有键)。初始
    null
    检查和
    how_many=0
    初始化会处理此问题
  • 只有一把钥匙。在这种情况下,循环将通过一次,
    ++how_many
    将在离开
    how_many==1
    时被命中
  • 有不止一把钥匙。在这种情况下,由于
    中断
    ,循环将只进行两次迭代。我们知道,一旦遇到第二个键,就会得到一个
    false
    结果,因此无需继续计数
  • 该函数最多进行两次循环迭代。这仍然是一个循环,但没有规则强制您在不需要的时候运行整个循环,您总是可以提前中断

    演示:

    对逻辑稍加调整就会得到“最多一个”、“至少一个”等等

    如果您不是天生的C程序员,那么您可以稍微展开一下逻辑:

    for own key of obj
        ++how_many
        break if(how_many == 2)
    
    你也可以这样写:

    (break if(++how_many == 2)) for own key of obj
    
    但这就把它推到了我的身上

    own
    东西只是添加了检查,以避免意外地从原型中抓取东西。你可能不需要这样,但既然他们真的想要抓住我,我宁愿在谨慎方面犯错

    还有,但这并不是普遍支持的,当您只关心其长度是否为1时,它必须构建一个完整的数组:

    exactly_one = (obj) ->
        return false if(!obj)
        Object.keys(obj).length == 1
    

    演示:

    for
    循环的
    有什么问题吗?如果一个对象有一个键和一个值,我认为有一种更有效的方法可以做到这一点。但是我可能错了。
    for..in
    是在JS中发现对象键的最有效的方法,而不是
    object.keys()
    。注释将问题从一些奇怪的、可能毫无意义的内容更改为更有趣的内容,因此我将其合并到问题中,并反转了我的投票。browser还是node.JS?如果您使用的是node.js或依赖于用户拥有合适的浏览器,则可以使用
    Object.keys