CoffeeScript'te anonim nesneler dizisi tanımlama


105

CoffeeScript'te bir anonim nesne dizisini nasıl tanımlarım? YAML sözdizimini kullanarak bu mümkün müdür?

Bir dizi adlandırılmış nesneye sahip olmanın oldukça kolay olduğunu biliyorum:

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

Ancak, bu iki nesnenin adı yoksa biraz daha yanıltıcı olurdu.

Yanıtlar:


28

yapamazsın:

bu bazı hileler:

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

bir diğeri

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

bu en iyisi:

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

6
O kadar çirkin değil mi :( Coffeescript, girintiye dayalı kodlaması için gerçekten güzel, ancak büyük nesne değişmezleri için standart JSON'dan çok daha iyi değil çünkü tüm parantezleri dengelemek zorunda kalıyorsunuz ve sonunda kötü bir köşeli parantez çorbası elde ediyorsunuz. bunu çözmek ve YAML sözdizimini kullanmak için bir bilet, ancak görünüşe göre kahvede bu talihsiz olanı çözmek için ayrıştırma belirsizliği var.
bradgonesurf

"Doğru &&" yerine tabii ki eşdeğer "evet ve" veya "hayır veya" ifadelerini kullanabilirsiniz. "evet ve" bile burada mantıklı.
Jameson Quinn

18
Cevabıma bir göz atın - bu, herhangi bir numara veya diş teli olmadan mükemmel bir şekilde yapılabilir.
Michael Hays

301

Basit - nesnelerinizi tanımladığınızdan daha düşük bir sütuna tek başına virgül koyun.

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

Olacak:

var a;

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

1
çünkü bu garip görünen bir çözüm ve virgüllerin kolayca gözden
kaçması

Bu tehlikeli!! Bazen size sadece son öğeyle bir dizi verir! Aşağıdaki
örneğime

1
@DeanRadcliffe Virgülü düzgün yerleştirmezseniz dizideki son öğeyi döndürecektir, evet, ancak CoffeeScript sözdizimsel şeker yerine kongre öncülüne dayalı değil mi?
dubilla

Bir [sonraki satırın solundaki açıklığı girintili yapardım , yeterince kafa karıştırıcı ..
matanster

4
Kahvenin vanilyaya göre basitleştirme ve iyileştirme olmak yerine çok daha gereksiz komplikasyonlar yarattığını düşünüyorum. Kahveye ihtiyaç duymadan ray entegrasyonu ile sadece .js kullanmayı çok isterim.
LasagnaAndroid

40

Ayrıca her nesnenin arasına bir koma da ekleyebilirsiniz: 

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

14

Virgül çözümünün daha iyi olduğunu düşünüyorum, ancak bütünlük için şunu ekleyeceğimi düşündüm:

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

Bence bu, virgül yerleştirme konusunda dikkatli olmanız gereken virgül çözümünden çok daha iyi.
nima

3

Diziyi tanımlarken değişkeni tanımlayabilirsiniz, bu nedenle çirkin bir cevap şöyle olur:

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

Çalışır, ancak "tanımlanmış ancak kullanılmayan değişkenler (öğe1, öğe2)" hakkında uyarılar alabilirsiniz. Daha iyi bir yol, kullanılmayan değişkenleri atlamak için kullanılan değişken olan alt çizgi kullanmaktır:

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

console.log JSON.stringify(a) bunu üretecek:

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

1

OP'nin sorusuna bir cevap değil, ama benimle aynı nedenden dolayı burada olmanız durumunda ... Mountain Dew'da düşük seviyedeyseniz ve ':' yerine '=' kullanırsanız, Coffeescript dizinizi değiştirecektir derleme hatası olmadan düz bir diziye nesnelerin sayısı:

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

Üretir

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

Daha fazla Mountain Dew ekleyin ve '=' yerine ':' koyun.


2
dağ çininin bununla ilgisi var mı?
2014

1

Biraz uğraştıktan sonra bunu tam olarak derleyebileceğimi bildirmekten çok mutluyum:

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

Tam da beklediğiniz gibi sonuçlanır: iki anonim nesnenin listesi.


0

İlgili bir sorunla karşılaştım ve bu çözümü buldum. Küme ayracı olmayan birçok tek k / v nesnesi dizisi istiyorsanız, sadece bazılarını girintileyin. Hile yapıyor gibi görünüyor.

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       
]                                            

Üretir:

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

Bu benim için mantıksız; bunun alt nesneler oluşturacağını düşünürdünüz ama bence satırın sonundaki virgül ona o nesne üzerinde özellik yapmayı bırakmasını söylüyor.


Bu işe yararken, satırların nasıl ayrıştırıldığının bir yan etkisi olduğundan şüpheleniyorum. Birbirini izleyen satırlar aynı girintiye sahip olmadığından, onları aynı nesneye koyamaz. Görünüşe göre, bir sözdizimi hatası yükseltmek yerine, yeni bir nesne başlatıyor. Belgelenmiş bulamadığınız sürece, muhtemelen güvenilmemesi gereken bir özelliktir.
hpaulj

@hpaulj peki eğer bunu yapmanın daha iyi bir yolu varsa, ben kulaklarım
jcollum

1
Yana Pythonbenim 'İlk dili, ben birkaç ekstra parantez ve parantez korkmam. Coffeescript bunlara ihtiyaç duymasa bile, onları faydalı buluyorum. İkinci bloğunuz daha okunabilir.
hpaulj

0

Neden olmasın:

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

Bu hala benim için js'ye göre çok büyük bir gelişme, okuması çok kolay, minimal ve yazması oldukça güvenli.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.