Определение массива анонимных объектов в 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"}
]
остров205
источник
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
Я думаю, что coffeescript, вместо того, чтобы быть упрощением и улучшением по сравнению с ванилью, порождает гораздо больше ненужных сложностей. Хотелось бы использовать простой .js с интеграцией rails без необходимости кофе.
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

Не ответ на вопрос OP, но на всякий случай, если вы здесь по той же причине, что и я ... Если у вас мало Mountain Dew и вы используете '=' вместо ':', то Coffeescript превратит ваш массив объектов в плоский массив без ошибки компиляции:

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

Производит

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

Вставьте еще Mountain Dew и замените '=' на ':'.

Сет
источник
2
Черт возьми, при чем тут горная роса?
fent 05
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 } ]

Мне это противоречит интуиции; вы могли бы подумать, что это создаст подобъекты, но я думаю, что запятая в конце строки говорит ему, чтобы он прекратил создавать свойства для этого объекта.

Jcollum
источник
Хотя это работает, я подозреваю, что это побочный эффект того, как анализируются строки. Поскольку последовательные строки не имеют одинакового отступа, он не может поместить их в один и тот же объект. Видимо, вместо того, чтобы вызвать синтаксическую ошибку, он запускает новый объект. Это функция, на которую, вероятно, не стоит рассчитывать - если вы не найдете ее задокументированной.
hpaulj
@hpaulj хорошо, если у вас есть лучший способ сделать это, я все уши
jcollum
1
Поскольку Pythonэто мой «первый язык», я не боюсь использовать несколько дополнительных скобок и скобок. Даже если Coffeescript они не нужны, я считаю их полезными. Ваш второй блок более читабелен.
hpaulj
0

Почему нет:

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

Для меня это по-прежнему огромное улучшение по сравнению с js, очень легко читать, минимально и довольно безопасно писать.

эрандрос
источник