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 &&"대신 "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 솔루션과 쉼표가 간과하기 쉬운
에디 몽주 주니어

위험하다 !! 때로는 마지막 항목이있는 배열 만 제공합니다! 아래 내 예를 참조하십시오.
Dean Radcliffe

1
@DeanRadcliffe 쉼표를 올바르게 배치하지 않으면 배열의 마지막 항목을 반환합니다. 그렇습니다. 그러나 CoffeeScript는 구문 적 설탕에 대한 관례를 전제로 구축되지 않았습니까?
dubilla 2014 년

나는 [다음 줄의 왼쪽에 개구부 를 들여 쓰기 할 것입니다 . 그것은 충분히 혼란 스럽습니다.
matanster

4
나는 coffeescript가 바닐라보다 단순화되고 개선되는 대신 훨씬 더 불필요한 합병증을 생성한다고 생각합니다. 커피없이 레일 통합과 함께 평범한 .js를 사용하고 싶습니다.
LasagnaAndroid

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
산 이슬이 이것과 관련이 있습니까?
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 2013-09-25

당신이 할 수있는 더 좋은 방법을 가지고 잘 경우 @hpaulj 나는 모든 귀 해요
jcollum

1
이후 Python내 '모국어', 나는 몇 가지 추가 괄호와 중괄호를 사용하는 것을 두려워하지 않다. Coffeescript가 필요하지 않더라도 도움이 될 것입니다. 두 번째 블록이 더 읽기 쉽습니다.
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.