Định nghĩa một mảng các đối tượng ẩn danh trong CoffeeScript


105

Làm cách nào để xác định một mảng các đối tượng ẩn danh trong CoffeeScript? Điều này có khả thi không, bằng cách sử dụng cú pháp YAML?

Tôi biết rằng có một mảng các đối tượng được đặt tên là khá dễ dàng:

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

Tuy nhiên, sẽ phức tạp hơn một chút, nếu hai đối tượng đó không có tên

Câu trả lời:


28

bạn không thể:

đây là một số thủ thuật:

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

khác

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

đây là thứ tốt nhất:

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

6
Điều đó không quá xấu xí sao :( Coffeescript thực sự tốt vì nó viết mã dựa trên thụt lề nhưng đối với các ký tự đối tượng lớn, nó không tốt hơn nhiều so với JSON tiêu chuẩn vì bạn phải cân bằng tất cả các dấu ngoặc và bạn kết thúc với món súp ngoặc kép khó chịu. Có một vé để giải quyết này và sử dụng cú pháp YAML nhưng dường như có phân tích cú pháp không rõ ràng trong coffeescript để giải quyết này đó là không may.
bradgonesurfing

Thay vì "true &&", tất nhiên bạn có thể sử dụng tương đương "yes và" hoặc "no or". "có và" thậm chí có ý nghĩa ở đây.
Jameson Quinn

18
Kiểm tra câu trả lời của tôi - điều này hoàn toàn có thể làm được mà không cần bất kỳ thủ thuật hoặc niềng răng nào.
Michael Hays

301

Đơn giản - tự đặt dấu phẩy vào cột thấp hơn cột mà bạn xác định đối tượng của mình.

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

Sẽ trở thành:

var a;

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

1
bởi vì nó là một giải pháp lookin lạ và dấu phẩy có thể dễ dàng bỏ qua
Eddie Monge Jr

Điều này nguy hiểm!! Đôi khi chỉ cung cấp cho bạn một mảng với mục cuối cùng! Xem ví dụ của tôi dưới đây ..
Dean Radcliffe

1
@DeanRadcliffe Nó sẽ trả về mục cuối cùng trong mảng nếu bạn không đặt dấu phẩy đúng cách, vâng, nhưng không phải CoffeeScript được xây dựng dựa trên tiền đề của quy ước về cú pháp?
dubilla

Tôi sẽ thụt lề phần mở [ở bên trái của dòng tiếp theo, nó đủ khó hiểu như vậy ..
matanster

4
Tôi nghĩ rằng coffeescript, thay vì đơn giản hóa và cải tiến so với vani sẽ tạo ra nhiều biến chứng không cần thiết hơn. Rất thích sử dụng .js đơn giản có tích hợp đường ray mà không cần cà phê.
LasagnaAndroid

40

Bạn cũng có thể thêm hôn mê giữa mỗi đối tượng: 

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

14

Tôi nghĩ rằng giải pháp dấu phẩy là tốt hơn, nhưng tôi đã nghĩ rằng tôi sẽ thêm điều này cho đầy đủ:

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

Tôi nghĩ điều này tốt hơn nhiều so với giải pháp dấu phẩy, nơi bạn phải cẩn thận với việc đặt dấu phẩy.
nima

3

Bạn có thể xác định biến trong khi xác định mảng, vì vậy câu trả lời xấu sẽ là:

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

Nó sẽ hoạt động, nhưng bạn có thể nhận được cảnh báo về "các biến được xác định, nhưng không được sử dụng (item1, item2)". Cách tốt hơn là sử dụng dấu gạch dưới, biến được sử dụng để bỏ qua các biến không được sử dụng:

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

console.log JSON.stringify(a) sẽ tạo ra cái này:

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

1

Không phải là câu trả lời cho câu hỏi của OP, nhưng chỉ trong trường hợp bạn ở đây vì lý do tương tự như tôi ... Nếu bạn thấp trên Mountain Dew và sử dụng '=' thay vì ':', thì Coffeescript sẽ biến mảng của bạn của các đối tượng thành một mảng phẳng mà không có lỗi biên dịch:

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

Sản xuất

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

Chèn thêm Mountain Dew và thay thế '=' bằng ':'.


2
wtf sương núi có liên quan đến điều này không?
fent

1

Tôi rất vui khi báo cáo sau một chút loay hoay rằng tôi có thể biên dịch cái này vừa phải:

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

Kết quả đúng như những gì bạn mong đợi: một danh sách hai đối tượng ẩn danh.


0

Tôi gặp phải một vấn đề liên quan và tìm ra giải pháp này. Nếu bạn muốn một mảng gồm nhiều đối tượng k / v đơn lẻ không có dấu ngoặc nhọn, chỉ cần thụt lề một số trong số chúng. Có vẻ để làm các thủ thuật.

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       
]                                            

Sản xuất:

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

Nó phản trực giác đối với tôi; bạn nghĩ rằng điều này sẽ tạo ra các đối tượng con nhưng tôi nghĩ dấu phẩy ở cuối dòng cho biết nó ngừng tạo thuộc tính trên đối tượng đó.


Trong khi điều này hoạt động, tôi nghi ngờ đó là một tác dụng phụ của cách các dòng được phân tích cú pháp. Vì các dòng liên tiếp không có cùng một vết lõm, nó không thể đặt chúng vào cùng một đối tượng. Rõ ràng, thay vì đưa ra một lỗi cú pháp, nó bắt đầu một đối tượng mới. Đó là một tính năng có lẽ không nên tính đến - trừ khi bạn có thể tìm thấy nó được ghi lại.
hpaulj 25/09/13

@hpaulj tốt nếu bạn đã có một cách tốt hơn để làm điều này tôi là tất cả tai
jcollum

1
Pythonlà 'ngôn ngữ đầu tiên' của tôi, tôi không ngại sử dụng thêm một vài dấu ngoặc và dấu ngoặc nhọn. Ngay cả khi Coffeescript không cần chúng, tôi thấy chúng rất hữu ích. Khối thứ hai của bạn dễ đọc hơn.
hpaulj 25/09/13

0

Tại sao không:

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

Nó vẫn là một cải tiến lớn đối với tôi so với js, rất dễ đọc, tối thiểu và khá an toàn để viết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.