การวนซ้ำทุกคุณสมบัติของวัตถุในจาวาสคริปต์โดยใช้ Prototype?


89

มีวิธีการวนซ้ำทุกคุณสมบัติของวัตถุโดยใช้กรอบงาน Prototype JavaScript หรือไม่?

นี่คือสถานการณ์: ฉันได้รับการตอบสนอง AJAX ใน JSON ที่มีลักษณะดังนี้:

{foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

หากฉันประเมินการตอบสนองของ json ในตัวแปรresponseฉันต้องการที่จะวนซ้ำในแต่ละคุณสมบัติในresponse.barobjออบเจ็กต์เพื่อดูว่าดัชนีใดเป็นจริงและอันใดเป็นเท็จ

ต้นแบบมีทั้งObject.keys()และObject.values()แต่แปลกที่ดูเหมือนว่าจะไม่ได้ง่ายObject.each()ฟังก์ชั่น! ฉันสามารถใช้ผลลัพธ์ของ Object.keys () และ Object.values ​​() และการอ้างอิงไขว้กันในขณะที่ฉันวนซ้ำไปมา แต่นั่นเป็นการแฮ็กที่ฉันแน่ใจว่ามีวิธีที่เหมาะสมในการทำ!

คำตอบ:


42

ก่อนอื่นคุณต้องแปลง object literal เป็น Prototype Hash :

// Store your object literal
var obj = {foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

// Iterate like so.  The $H() construct creates a prototype-extended Hash.
$H(obj).each(function(pair){
  alert(pair.key);
  alert(pair.value);
});

สมบูรณ์แบบ! นี่คือสิ่งที่ฉันกำลังมองหา
OverloadUT

57
น่าเสียดายที่คำถามที่คล้ายกันนี้ถูกปิดไปคำถามหนึ่งที่ต้องการย้ำซ้ำบนวัตถุจาวาสคริปต์ธรรมดาที่ไม่มี Prototype ตอนนี้ฉันต้องปฏิบัติต่อคำตอบนี้ราวกับว่าเป็นคำถามที่ถูกปิดเนื่องจาก "การทำซ้ำ" ตัวอย่างที่น่าสยดสยองเมื่อบังคับให้ผู้ใช้โหลด Prototype ผู้ใช้ไม่ได้พูดอะไรเกี่ยวกับ Prototype ดังนั้นการบังคับให้พวกเขาโหลดไลบรารีที่ไม่ต้องการจึงไม่มีประโยชน์ (จำไว้ว่าให้ปฏิบัติราวกับว่ามันซ้ำกันจริงๆ) หากคำถามอื่นไม่ถูกปิดลงเนื่องจากการอ้างสิทธิ์ซ้ำซ้อนฉันก็ไม่ต้องลงคะแนนคำตอบ

2
ผู้ถามไม่ได้พูดถึงพวกเขาต้องการ Prototype (หรือคำถามถูกแก้ไขแล้ว?)? อย่างไรก็ตามทุกอย่างก็ดี
emurano

ไม่จำเป็นต้องโหลดไลบรารีภายนอก
Healkiss

553

ไม่จำเป็นต้องมี Prototype ที่นี่: JavaScript มีfor..inลูป หากคุณไม่แน่ใจว่าไม่มีใครยุ่งด้วยObject.prototypeให้ตรวจสอบhasOwnProperty()ด้วยเช่น

for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
        doSomethingWith(obj[prop]);
}

140
ขอบคุณสำหรับคำตอบที่แท้จริงโดยไม่ต้องบังคับให้เราโหลดไลบรารีที่ไม่ต้องการ

8
นี่ไม่ใช่คำตอบที่เข้มงวด คำถามระบุว่าต้องใช้ต้นแบบ! เสรีภาพในการเลือก - ฮ่าฮ่า ...
Sven Larson

1
ชื่อเดิมของคำถามนี้กล่าวถึง Prototype ซึ่งฉันได้เพิ่มกลับเข้าไปเพื่อความชัดเจน คำถามนี้ตามที่เห็นได้จากบรรทัดแรกของเนื้อหาเป็นการถามเฉพาะเกี่ยวกับสภาพแวดล้อมที่ใช้ Prototype อยู่
OverloadUT

1
ยิ่งคุณเขียน Javascript มากเท่าไหร่คุณก็จะยิ่งเกลียดการเขียนforลูปมากขึ้นเท่านั้น :)
Triptych

13
น่าเสียดายที่นี่เป็นคำถามที่ปรากฏขึ้นเป็น # 1 หากคุณใช้ Google ในเรื่อง "วิธีการวนซ้ำจาวาสคริปต์คุณสมบัติของอ็อบเจ็กต์ทุกรายการ" ผู้คนจำนวนมากที่มาที่นี่อาจกำลังมองหาคำตอบ คำถามที่พวกเขาต้องการคือสิ่งนี้stackoverflow.com/questions/921789/…ซึ่งไม่มีส่วนเกี่ยวข้องกับตัวอักษรวัตถุ
Baxissimo

0

คุณควรย้ำคีย์และรับค่าโดยใช้วงเล็บเหลี่ยม

ดู: ฉันจะแจกแจงคุณสมบัติของวัตถุจาวาสคริปต์ได้อย่างไร

แก้ไข:เห็นได้ชัดว่าสิ่งนี้ทำให้คำถามซ้ำกัน


ไม่สนับสนุนวิธีการดังกล่าวอย่างยิ่งในเอกสาร Prototype: prototypejs.org/api/array
OverloadUT

1
นอกจากนี้ฉันไม่คิดว่านี่จะซ้ำกันเพราะฉันกำลังมองหาโซลูชัน Prototype-native ซึ่งเป็นสิ่งที่ฉันได้รับ คำถามอื่น ๆ เหมาะสำหรับคนที่ไม่ต้องการให้ใช้เฟรมเวิร์ก แต่วิธีนี้ปลอดภัยกว่ามากหากคุณใช้ Prototype
OverloadUT

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