Mendefinisikan larik objek anonim di CoffeeScript

105

Bagaimana cara saya mendefinisikan array objek anonim di CoffeeScript? Apakah ini mungkin sama sekali, menggunakan sintaks YAML?

Saya tahu bahwa memiliki larik objek bernama cukup mudah:

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

Namun, akan sedikit lebih rumit, jika kedua objek tersebut tidak memiliki nama

Preslav Rachev
sumber

Jawaban:

28

Anda tidak bisa:

ini beberapa trik:

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

lain

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

Ini yang terbaik:

items:[
    {name:"value1"}
    {name:"value2"}
]
pulau205
sumber
6
Bukankah itu sangat jelek :( Coffeescript sangat bagus untuk pengkodean berbasis indentasi tetapi untuk literal objek besar itu tidak jauh lebih baik daripada JSON standar karena Anda harus menyeimbangkan semua tanda kurung dan Anda berakhir dengan sup braket trailing yang buruk. Ada tiket untuk menyelesaikan ini dan menggunakan sintaks YAML tetapi tampaknya ada ambiguitas parsing dalam coffeescript untuk menyelesaikan ini yang sangat disayangkan.
bradgonesurfing
Daripada "benar &&", Anda tentu saja bisa menggunakan padanan "ya dan" atau "tidak atau". "ya dan" bahkan agak masuk akal di sini.
Jameson Quinn
18
Lihat jawaban saya - ini sangat bisa dilakukan tanpa trik atau kawat gigi.
Michael Hays
301

Sederhana - letakkan koma dengan sendirinya di kolom yang lebih rendah daripada tempat Anda mendefinisikan objek.

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

Akan menjadi:

var a;

a = [
  {
    nameA1: valueA1,
    nameA2: valueA2,
    nameA3: valueA3
  }, {
    nameB1: valueB1,
    nameB2: valueB2,
    nameB3: valueB3
  }
];
Michael Hays
sumber
1
karena ini adalah solusi lookin yang aneh dan koma mudah terlewatkan
Eddie Monge Jr
Ini berbahaya!! Terkadang hanya memberi Anda larik dengan item terakhir! Lihat contoh saya di bawah ini ..
Dean Radcliffe
1
@DeanRadcliffe Ini akan mengembalikan item terakhir dalam larik jika Anda tidak menempatkan koma dengan benar, ya, tetapi bukankah CoffeeScript dibangun di atas premis konvensi di atas gula sintaksis?
dubilla
Saya akan mengindentasi pembukaan [di sebelah kiri baris berikutnya, itu cukup membingungkan ..
matanster
4
Saya pikir coffeescript, alih-alih menjadi penyederhanaan dan peningkatan vanilla menghasilkan lebih banyak komplikasi yang tidak perlu. Ingin sekali menggunakan .js biasa dengan integrasi rel tanpa perlu kopi.
LasagnaAndroid
40

Anda juga dapat menambahkan koma di antara setiap objek: 

items:[
    item1:
        name1:value1
  ,
    item2:
        name:value2
]
arthur
sumber
14

Saya pikir solusi koma lebih baik, tetapi saya pikir saya akan menambahkan ini untuk kelengkapan:

a = [
  {
    nameA1: valueA1
    nameA2: valueA2
    nameA3: valueA3
  }
  {
    nameB1: valueB1
    nameB2: valueB2
    nameB3: valueB3
  }
]
Evan Moran
sumber
Saya pikir ini jauh lebih baik daripada solusi koma, di mana Anda harus berhati-hati dengan penempatan koma.
nima
3

Anda dapat mendefinisikan variabel saat mendefinisikan array, jadi jawaban yang jelek adalah:

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

Ini akan berhasil, tetapi Anda mungkin mendapatkan peringatan tentang "ditentukan, tetapi tidak menggunakan variabel (item1, item2)". Cara yang lebih baik adalah menggunakan garis bawah, variabel yang digunakan untuk menghilangkan variabel yang tidak digunakan:

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

console.log JSON.stringify(a) akan menghasilkan ini:

  {
    "items":[
      {
        "name":"value1"
      },{
        "name":"value2"
      }
    ]
  }
remiq
sumber
1

Bukan jawaban untuk pertanyaan OP, tapi kalau-kalau Anda berada di sini karena alasan yang sama dengan saya ... Jika Anda rendah di Mountain Dew dan menggunakan '=' daripada ':', maka Coffeescript akan mengubah array Anda objek ke dalam larik datar tanpa kesalahan kompilasi:

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

Menghasilkan

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

Masukkan lebih banyak Mountain Dew dan ganti '=' dengan ':'.

Seth
sumber
2
Apa hubungannya embun gunung dengan ini?
fent
1

Saya sangat senang untuk melaporkan setelah sedikit mengutak-atik bahwa saya dapat menyusun ini dengan benar:

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

Hasilnya seperti yang Anda harapkan: daftar dua objek anonim.

Prathan Thananart
sumber
0

Saya mengalami masalah terkait dan menemukan solusi ini. Jika Anda menginginkan sebuah array dari banyak objek k / v tunggal tanpa tanda kurung, cukup indentasi beberapa di antaranya. Tampaknya berhasil.

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       
]                                            

Menghasilkan:

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

Ini kontra-intuitif bagi saya; Anda akan berpikir bahwa ini akan membuat sub-objek tetapi saya pikir koma di akhir baris menyuruhnya berhenti membuat properti pada objek itu.

jcollum.dll
sumber
Sementara ini berfungsi, saya menduga itu adalah efek samping dari bagaimana garis diuraikan. Karena garis berurutan tidak memiliki lekukan yang sama, garis tersebut tidak dapat ditempatkan di objek yang sama. Rupanya, alih-alih memunculkan kesalahan sintaks, itu memulai objek baru. Ini adalah fitur yang mungkin tidak dapat diandalkan - kecuali Anda dapat menemukannya didokumentasikan.
hpaulj
@hpaulj baik jika Anda punya cara yang lebih baik untuk melakukan ini Saya mendengarkan
jcollum
1
Karena Pythonadalah 'bahasa pertama' saya, saya tidak takut menggunakan beberapa tanda kurung dan tanda kurung tambahan. Bahkan jika Coffeescript tidak membutuhkannya, saya merasa itu berguna. Blok kedua Anda lebih mudah dibaca.
hpaulj
0

Kenapa tidak:

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

Ini masih merupakan peningkatan besar bagi saya atas js, sangat mudah dibaca, minimal dan cukup aman untuk ditulis.

erandros
sumber