CoffeeScriptでの匿名オブジェクトの配列の定義


105

CoffeeScriptで匿名オブジェクトの配列を定義するにはどうすればよいですか?YAML構文を使用してこれはまったく可能ですか?

名前付きオブジェクトの配列を持つことは非常に簡単です:

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

ただし、これらの2つのオブジェクトに名前がない場合は、少しトリッキーになります

回答:


28

次のことはできません。

これはいくつかのトリックです:

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

別の

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

これが一番:

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

6
Coffeescriptは、インデントベースのコーディングに最適ですが、ラージオブジェクトリテラルの場合、すべての角かっこでバランスをとる必要があり、厄介な末尾の角かっこスープになってしまうため、標準のJSONよりも優れているとは言えません。これを解決してYAML構文を使用するためのチケットですが、どうやらこれを解決するためにcoffeescriptに解析のあいまいさがあり、これは残念なことです
bradgonesurfing

「true &&」の代わりに、同等の「yes and」または「no or」を使用することもできます。ここで「はい」と言っても意味があります。
Jameson Quinn

18
私の答えを確認してください-これは、トリックやブレースなしで完全に実行可能です。
Michael Hays

301

単純-オブジェクトを定義する列よりも下の列に、コンマを単独で配置します。

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
  }
];

1
奇妙なlookinソリューションとカンマが見落とされやすいため
Eddie Monge Jr

これは危ない!! 時々、最後のアイテムの配列のみを与えます!下の私の例を参照してください...
ディーン・ラドクリフ

1
@DeanRadcliffeカンマを適切に配置しないと、配列の最後の項目が返されます(そうですが、CoffeeScriptは構文上の砂糖よりも慣例を前提として構築されていませんか?)
dubilla 2014年

私は、開口部インデントでしょう[。..あるとして、それは十分に混乱だ、次の行の左側にあるを
matanster

4
コーヒースクリプトは、バニラを単純化して改善するのではなく、より多くの不必要な複雑さを生み出すと思います。コーヒーを必要とせずにRails統合でプレーンな.jsを使用したいと思います。
LasagnaAndroid 2014年

40

各オブジェクト間にコマを追加することもできます。 

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

14

カンマの方が良いと思いますが、完全を期すためにこれを追加すると思いました。

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

これは、コンマの配置に注意する必要があるコンマソリューションよりもはるかに優れていると思います。
nima 2015

3

配列を定義するときに変数を定義できるため、醜い答えは次のようになります。

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"
      }
    ]
  }

1

OPの質問への回答ではありませんが、同じ理由でここにいる場合に備えて... Mountain Dewが少なく、「:」の代わりに「=」を使用すると、Coffeescriptは配列を変換しますコンパイルエラーなしのオブジェクトのフラット配列への変換:

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

生産する

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

さらにMountain Dewを挿入し、「=」を「:」に置き換えます。


2
山露はこれと関係がありますか?
フェント

1

これを適切にコンパイルできるように少し手を加えた後、私は非常に満足しています:

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

それはあなたが期待するとおりの結果になります:2つの匿名オブジェクトのリスト。


0

私は関連する問題に遭遇し、この解決策を見つけました。中括弧のない多数の単一の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 2013

@hpauljこれを行うためのより良い方法があれば、私はすべて耳です
jcollum '25 / 09/25

1
以来Python、私の「第一言語」であり、私はいくつかの余分な括弧や中括弧を使用することを恐れていませんよ。Coffeescriptがそれらを必要としない場合でも、私はそれらが役立つと思います。2番目のブロックはより読みやすくなっています。
hpaulj 2013

0

何故なの:

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

それはjsに比べて私にとってはまだ大きな改善です。非常に読みやすく、最小限で、安全に書くことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.