Визначення масиву анонімних об'єктів у CoffeeScript


105

Як визначити масив анонімних об'єктів у CoffeeScript? Чи можливо це взагалі, використовуючи синтаксис YAML?

Я знаю, що мати масив з названими об'єктами досить просто:

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

Однак було б трохи складніше, якби ці два об’єкти не мали імен

Відповіді:


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 &&" ви, звичайно, можете використовувати еквівалент "так і" або "ні або". "так і" навіть тут має сенс.
Джеймсон Куїн

18
Ознайомтеся з моєю відповіддю - це цілком можливо здійснити без жодних хитрощів чи дужок.
Майкл Хейс

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
тому що його дивне рішення, і коми легко пропускаються
Едді Монж молодший

Це небезпечно !! Іноді дає лише масив з останнім елементом! Дивіться мій приклад нижче ..
Дін Редкліфф

1
@DeanRadcliffe Він поверне останній елемент у масиві, якщо ви не розташуєте кома належним чином, так, але хіба CoffeeScript не побудований на умові умовності щодо синтаксичного цукру?
dubilla

Я б відступив відкриття [ліворуч від наступного рядка, це досить заплутано, як є ..
matanster

4
Я вважаю, що замість того, щоб спростити та покращити ваніль, кофе-сценарій створює набагато більше непотрібних ускладнень. Хочеться використовувати просто .js з інтеграцією рейок без потреби в каві.
LasagnaAndroid

40

Ви також можете додати кому між кожним об'єктом: 

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

14

Я думаю, що рішення з комою краще, але я подумав, що додаю це для повноти:

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

Я думаю, що це набагато краще, ніж рішення з комою, де потрібно бути обережним з розміщенням коми.
німа

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

Не відповідь на запитання ОП, але про всяк випадок, коли ви тут з тієї ж причини, що і я був ... Якщо ви низько на гірській росі і використовуєте '=' замість ':', то Coffeescript поверне ваш масив об'єктів у плоский масив без помилки компіляції:

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

Виробляє

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

Вставте більше гірської роси та замініть '=' на ':'.


2
wtf чи має до цього гірська роса?
fent

1

Я дуже радий повідомити, трохи подумавши про те, що можу скласти це так, як правильно:

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

Це призводить до того, що ви очікували: список двох анонімних об'єктів.


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

@hpaulj добре, якщо у вас є кращий спосіб зробити це я все вуха
jcollum

1
Оскільки Pythonце моя «перша мова», я не боюся використовувати декілька додаткових дужок і дужок. Навіть якщо Coffeescript їм не потрібен, я вважаю їх корисними. Ваш другий блок є більш читабельним.
hpaulj

0

Чому ні:

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

Це все ще величезне вдосконалення для мене над js, дуже легко читати, мінімально та досить безпечно писати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.