การกำหนดอาร์เรย์ของวัตถุที่ไม่ระบุชื่อใน 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 แต่เห็นได้ชัดว่ามีการแยกวิเคราะห์ความคลุมเครือในกาแฟเพื่อแก้ปัญหานี้ซึ่งเป็นเรื่องที่ไม่ดี
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
เพราะมันเป็นวิธีการแก้ปัญหาที่ดูแปลกและพลาดจุลภาคได้ง่าย
Eddie Monge Jr

แบบนี้อันตราย !! บางครั้งจะให้อาร์เรย์กับรายการสุดท้ายเท่านั้น! ดูตัวอย่างของฉันด้านล่าง ..
Dean Radcliffe

1
@DeanRadcliffe มันจะส่งคืนรายการสุดท้ายในอาร์เรย์หากคุณวางลูกน้ำไม่ถูกต้องใช่ แต่ CoffeeScript ไม่ได้สร้างขึ้นจากหลักฐานการประชุมเรื่องน้ำตาลสังเคราะห์หรือไม่?
dubilla

ฉันจะเยื้องช่องเปิด[ไปทางซ้ายของบรรทัดถัดไปก็สับสนพอสมควร ..
matanster

4
ฉันคิดว่าคอฟฟี่สคริปส์แทนที่จะเป็นการทำให้เข้าใจง่ายและปรับปรุงวานิลลาจะทำให้เกิดภาวะแทรกซ้อนที่ไม่จำเป็นมากขึ้น ชอบที่จะใช้. js ธรรมดาที่มีการรวมรางโดยไม่ต้องใช้กาแฟ
LasagnaAndroid


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
wtf ภูเขาน้ำค้างเกี่ยวข้องกับสิ่งนี้หรือไม่?
ปัดป้อง

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 อ่านง่ายมากเขียนน้อยที่สุดและค่อนข้างปลอดภัย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.