【问题标题】:Defining an array of anonymous objects in CoffeeScript在 CoffeeScript 中定义一组匿名对象
【发布时间】:2012-02-20 05:12:41
【问题描述】:

如何在 CoffeeScript 中定义一组匿名对象?这是否可能,使用 YAML 语法?

我知道拥有一组命名对象非常简单:

items:[
   item1:
      name1:value1
   item2:
      name:value2
]

但是,如果这两个对象没有名称,那就有点棘手了

【问题讨论】:

    标签: coffeescript


    【解决方案1】:

    为什么不:

    list = []
    list.push
      prop1: val
      prop2: val
    list.push
      prop1: val
      prop2: val
    

    相对于 js,它对我来说仍然是一个巨大的进步,非常容易阅读,最小且写起来很安全。

    【讨论】:

      【解决方案2】:

      我很高兴在经过一番折腾后报告我可以正确编译:

      items: [
        nameA: subA
        nameB: subB
      ,
        nameX: subX
        nameY: subY
      ]
      

      结果如您所愿:两个匿名对象的列表。

      【讨论】:

        【解决方案3】:

        简单 -- 将逗号单独放在比您定义对象的列低的列中。

        a = [
             nameA1: valueA1
             nameA2: valueA2
             nameA3: valueA3
          ,
             nameB1: valueB1
             nameB2: valueB2
             nameB3: valueB3
        ]
        

        会变成:

        var a;
        
        a = [
          {
            nameA1: valueA1,
            nameA2: valueA2,
            nameA3: valueA3
          }, {
            nameB1: valueB1,
            nameB2: valueB2,
            nameB3: valueB3
          }
        ];
        

        【讨论】:

        • 因为它看起来很奇怪,而且很容易错过逗号
        • 这很危险!!有时只给你一个包含最后一项的数组!请参阅下面的示例..
        • @DeanRadcliffe 如果你没有正确放置逗号,它会返回数组中的最后一项,是的,但是CoffeeScript不是建立在语法糖约定的前提下吗?
        • 我会把开头的[缩进下一行的左边,这已经够混乱了..
        • 我认为,coffeescript 不是对原版的简化和改进,而是产生了更多不必要的复杂性。很想只使用简单的 .js 和 rails 集成,而不需要喝咖啡。
        【解决方案4】:

        你可以在定义数组时定义变量,所以一个丑陋的答案是:

        a = 
          items: [
            item1 = 
              name: 'value1'
            item2 = 
              name: 'value2'
          ]
        

        它会起作用,但您可能会收到有关“已定义但未使用的变量(item1,item2)”的警告。更好的方法是使用下划线,用于省略未使用变量的变量:

        a = 
          items: [
            _ = 
              name: 'value1'
            _ = 
              name: 'value2'
          ]
        

        console.log JSON.stringify(a) 会产生这个:

          {
            "items":[
              {
                "name":"value1"
              },{
                "name":"value2"
              }
            ]
          }
        

        【讨论】:

          【解决方案5】:

          不是对 OP 问题的回答,但以防万一您出于与我相同的原因来到这里...将您的对象数组转换为平面数组而不会出现编译错误:

          data = [
              one='one'
              two='two'
            ,
              one='1'
              two='2'
          ]
          

          生产

          ['one', 'two', '1', '2']
          

          插入更多 Mountain Dew 并将 '=' 替换为 ':'。

          【讨论】:

          • wtf 山露跟这个有关系吗?
          【解决方案6】:

          我遇到了一个相关问题并找到了这个解决方案。如果你想要一个包含许多没有大括号的单个 k/v 对象的数组,只需缩进其中的一些。似乎可以解决问题。

          data = [                                     
            "2013-09-25T16:46:52.636Z":3,              
              "2013-09-25T16:47:52.636Z":6,            
                "2013-09-25T16:48:52.636Z":2,          
                  "2013-09-25T16:49:52.636Z":7,        
            "2013-09-25T16:50:52.636Z":5,              
              "2013-09-25T16:51:52.636Z":2,            
                "2013-09-25T16:52:52.636Z":1,          
                  "2013-09-25T16:53:52.636Z":3,        
            "2013-09-25T16:54:52.636Z":8,              
              "2013-09-25T16:55:52.636Z":9,            
                "2013-09-25T16:56:52.636Z":2,          
                  "2013-09-25T16:57:52.636Z":5,        
                    "2013-09-25T16:58:52.636Z":7       
          ]                                            
          

          生产:

          coffee> data
          [ { '2013-09-25T16:46:52.636Z': 3 },
            { '2013-09-25T16:47:52.636Z': 6 },
            { '2013-09-25T16:48:52.636Z': 2 },
            { '2013-09-25T16:49:52.636Z': 7 },
            { '2013-09-25T16:50:52.636Z': 5 },
            { '2013-09-25T16:51:52.636Z': 2 },
            { '2013-09-25T16:52:52.636Z': 1 },
            { '2013-09-25T16:53:52.636Z': 3 },
            { '2013-09-25T16:54:52.636Z': 8 },
            { '2013-09-25T16:55:52.636Z': 9 },
            { '2013-09-25T16:56:52.636Z': 2 },
            { '2013-09-25T16:57:52.636Z': 5 },
            { '2013-09-25T16:58:52.636Z': 7 } ]
          

          这对我来说是违反直觉的;你会认为这会产生子对象,但我认为行尾的逗号告诉它停止在该对象上创建属性。

          【讨论】:

          • 虽然这可行,但我怀疑这是如何解析行的副作用。由于连续的行没有相同的缩进,它不能将它们放在同一个对象中。显然,它没有引发语法错误,而是启动了一个新对象。这是一个可能不应该被指望的特性——除非你能找到它的文档。
          • @hpaulj 好吧,如果你有更好的方法来做到这一点,我会全力以赴
          • 由于Python 是我的“第一语言”,我不怕使用一些额外的括号和大括号。即使 Coffeescript 不需要它们,我也觉得它们很有帮助。您的第二个块更具可读性。
          【解决方案7】:

          我认为逗号解决方案更好,但我想我会为了完整性添加这个:

          a = [
            {
              nameA1: valueA1
              nameA2: valueA2
              nameA3: valueA3
            }
            {
              nameB1: valueB1
              nameB2: valueB2
              nameB3: valueB3
            }
          ]
          

          【讨论】:

          • 我认为这比逗号解决方案要好得多,您必须小心逗号的放置。
          【解决方案8】:

          您还可以在每个对象之间添加一个逗号:

          items:[
              item1:
                  name1:value1
            ,
              item2:
                  name:value2
          ]
          

          【讨论】:

            【解决方案9】:

            你不能:

            这是一些技巧:

            items:[
                (name:"value1")
                (name:"value2")
            ]
            

            另一个

            items:[
                true && name:"value1"
                true && name:"value2"
            ]
            

            这是最好的:

            items:[
                {name:"value1"}
                {name:"value2"}
            ]
            

            【讨论】:

            • 不是那么难看吗 :( Coffeescript 非常好,因为它是基于缩进的编码,但对于大型对象文字,它并不比标准 JSON 好多少,因为你必须平衡所有括号,你最终会带有讨厌的尾括号汤。有一张票可以解决这个问题并使用 YAML 语法,但显然咖啡脚本中存在解析歧义来解决这个问题,这是不幸的。
            • 您当然可以使用等效的“yes and”或“no or”来代替“true &&”。 “是的,”在这里甚至有点道理。
            • 查看我的答案——这完全可行,无需任何技巧或括号。
            猜你喜欢
            • 2017-10-26
            • 1970-01-01
            • 2014-08-08
            • 1970-01-01
            • 2011-08-24
            • 2011-01-03
            • 1970-01-01
            • 2012-12-30
            • 2019-05-12
            相关资源
            最近更新 更多