วนซ้ำคุณสมบัติในวัตถุ JavaScript ด้วย Lodash


123

เป็นไปได้ไหมที่จะวนซ้ำคุณสมบัติในออบเจ็กต์ JavaScript ตัวอย่างเช่นฉันมีวัตถุ JavaScript ที่กำหนดไว้ดังนี้:

myObject.options = {
  property1: 'value 1',
  property2: 'value 2'
};

คุณสมบัติจะถูกเพิ่มลงในวัตถุนี้แบบไดนามิก มีวิธีให้ฉันวนลูปและตรวจสอบว่ามีทรัพย์สินอยู่หรือไม่? ถ้าเป็นเช่นนั้นอย่างไร?

คำตอบ:


34

ใช่คุณทำได้และไม่จำเป็นต้องใช้ lodash ... เช่น

for (var key in myObject.options) {
  // check also if property is not inherited from prototype
  if (myObject.options.hasOwnProperty(key)) { 
    var value = myObject.options[key];
  }
}

แก้ไข : คำตอบที่ยอมรับ ( _.forOwn () ) ควรเป็นhttps://stackoverflow.com/a/21311045/528262


6
+ ฉันรู้ว่าพวกเขาต้องการฟังก์ชั่นสไตล์ lodash ของฉันเป็นเพียงวิธีที่ทำให้ OP เข้าใจว่าคุณสามารถวน obj w / out ได้โดยขึ้นอยู่กับไลบรารี (ในกรณีที่เขาต้องการฟังก์ชันนั้นโดยไม่รวม lodash)
stecb

39
ในกรณีนี้การให้คำตอบทั้งสองข้อจะดี
flq

1
การใช้lodashและไม่ใช่สิ่งนี้เป็นธรรมโดยไม่ต้องการการhasOwnPropertyตรวจสอบที่น่ารำคาญเท่านั้น
Mugen

601

ใช้_.forOwn().

_.forOwn(obj, function(value, key) { } );

https://lodash.com/docs#forOwn

โปรดทราบว่าการforOwnตรวจสอบhasOwnPropertyตามที่คุณต้องทำเมื่อวนซ้ำคุณสมบัติของวัตถุ forInไม่ทำการตรวจสอบนี้


22
สำคัญมากที่ต้องสังเกตว่านั่นkeyคือพารามิเตอร์ตัวที่สอง แต่ก็สมเหตุสมผล
ฟิล

18

สำหรับความต้องการ "ตรวจสอบว่ามีทรัพย์สินอยู่หรือไม่" คุณสามารถใช้ Lo-Dash ได้hasโดยตรง

var exists = _.has(myObject, propertyNameToCheck);

3

แน่นอนคุณสามารถทำได้ด้วย vanilla JS เช่น stecb ที่แสดงไว้ แต่ฉันคิดว่าeachเป็นคำตอบที่ดีที่สุดสำหรับคำถามหลักเกี่ยวกับวิธีการใช้ lodash

_.each( myObject.options, ( val, key ) => { 
    console.log( key, val ); 
} );

เช่นเดียวกับ JohnnyHK ที่กล่าวถึงนอกจากนี้ยังมีhasวิธีการที่จะเป็นประโยชน์สำหรับกรณีการใช้งาน แต่จากสิ่งที่ระบุไว้ในตอนแรกsetอาจมีประโยชน์มากกว่า สมมติว่าคุณต้องการเพิ่มบางอย่างในวัตถุนี้แบบไดนามิกตามที่คุณได้กล่าวไว้:

let dynamicKey = 'someCrazyProperty';
let dynamicValue = 'someCrazyValue';

_.set( myObject.options, dynamicKey, dynamicValue );

นั่นเป็นวิธีที่ฉันจะทำตามคำอธิบายดั้งเดิม


2

ให้ใช้วัตถุด้านล่างเป็นตัวอย่าง

let obj = { property1: 'value 1', property2: 'value 2'};

ก่อนอื่นให้ดึงคีย์ทั้งหมดใน obj

let keys = Object.keys(obj) //it will return array of keys

แล้ววนซ้ำ

keys.forEach(key => //your way)

เพียงแค่รวบรวมทั้งหมดเข้าด้วยกัน

Object.keys(obj).forEach(key=>{/*code here*/})

1

ใน ES6 ยังเป็นไปได้ที่จะวนซ้ำค่าของวัตถุโดยใช้for..ofลูป อย่างไรก็ตามสิ่งนี้ใช้ไม่ได้ทันทีสำหรับวัตถุ JavaScript เนื่องจากคุณต้องกำหนดคุณสมบัติ @@ iterator บนวัตถุ ทำงานได้ดังนี้:

  • for..ofห่วงถาม "วัตถุที่จะซ้ำมากกว่า" (ขอเรียกว่า obj1 สำหรับวัตถุ iterator. the iterates ห่วงมากกว่า obj1 โดยต่อเนื่องเรียกถัดไป () วิธีการบนวัตถุ iterator ให้และการใช้ค่าที่ส่งกลับเป็นค่าสำหรับแต่ละซ้ำ ของวง
  • อ็อบเจ็กต์ตัววนซ้ำได้มาจากการเรียกใช้ฟังก์ชันที่กำหนดในคุณสมบัติ @@ iterator หรือคุณสมบัติ Symbol.iterator ของ obj1 นี่คือฟังก์ชันที่คุณต้องกำหนดด้วยตนเองและควรส่งคืนอ็อบเจ็กต์ตัววนซ้ำ

นี่คือตัวอย่าง:

const obj1 = {
  a: 5,
  b: "hello",
  [Symbol.iterator]: function() {
    const thisObj = this;
    let index = 0;
    return {
      next() {
        let keys = Object.keys(thisObj);
        return {
          value: thisObj[keys[index++]],
          done: (index > keys.length)
        };
      }
    };
  }
};

ตอนนี้เราสามารถใช้for..ofลูป:

for (val of obj1) {
  console.log(val);
}    // 5 hello

0

การทำความเข้าใจว่าทำไมคุณต้องทำเช่นนี้กับ lodash หากคุณเพียงต้องการตรวจสอบว่ามีคีย์อยู่ในวัตถุหรือไม่คุณไม่จำเป็นต้องใช้ lodash

myObject.options.hasOwnProperty('property');

หากคุณต้องการดูว่ามีค่าอยู่หรือไม่คุณสามารถใช้ _.invert

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