indexOf แต่สำหรับวัตถุ? [ทำซ้ำ]

ฉันต้องการตรวจสอบวัตถุและกำหนดคุณสมบัติที่มีอยู่ให้กับตัวแปร

มีคุณสมบัติที่เป็นไปได้ 4 ประการ วัตถุบางชิ้นมีทั้งหมด 4 ชิ้น บางชิ้นอาจมีเพียงสองชิ้นเท่านั้น

ฉันจะตรวจสอบได้อย่างไรว่ามีทรัพย์สินใดอยู่บ้าง? มีการเทียบเท่าของ indexOf() สำหรับอาร์เรย์ แต่สำหรับวัตถุแทนหรือไม่


person gloopit    schedule 18.08.2016    source แหล่งที่มา
comment
เป็นเรื่องยากมากที่จะจินตนาการถึงโค้ดของคุณจากข้อความธรรมดา สนใจที่จะเปิดเผยซอร์สโค้ดที่เกี่ยวข้องที่นี่หรือไม่ ทั้งนี้เพื่อให้เราสามารถช่วยเหลือคุณได้ดียิ่งขึ้น   -  person Samuel Toh    schedule 18.08.2016
comment
คุณได้ลอง hasOwnProperty หรือแปลงวัตถุเป็นอาร์เรย์ด้วย Object.keys แล้วหรือยัง?   -  person litel    schedule 18.08.2016
comment
หากคุณสมบัติไม่สามารถเป็นเท็จได้ (เช่น เป็นวัตถุย่อยทั้งหมด) การพิมพ์เป็ดก็สามารถอ่านได้และรวดเร็ว : if(obj.key1); alert(obj.key1.name);   -  person dandavis    schedule 18.08.2016
comment
false หรือ falsey รวมถึง 0 และค่าทั่วไปอื่นๆ   -  person qxz    schedule 18.08.2016
comment
@qxz: ใช่นั่นคือสิ่งที่ฉันหมายถึง โทรได้ดี   -  person dandavis    schedule 18.08.2016


คำตอบ (4)


หากคุณสนใจเฉพาะคุณสมบัติที่ตั้งค่าโดยตรงบนออบเจ็กต์ (ไม่สามารถเข้าถึงได้ผ่านสายโซ่ต้นแบบ) hasOwnProperty จะให้ค่าบูลีน true หากวัตถุมีคุณสมบัติที่ระบุ

ตัวอย่างเช่น: testObject.hasOwnProperty('propertyToCheckFor') จะส่งกลับ true ถ้ามี testObject.propertyToCheckFor อยู่ ไม่เช่นนั้นก็จะเป็น false

ดูโค้ดต่อไปนี้สำหรับตัวอย่างเพิ่มเติม:

var obj1 = {
  a: 1
};
var obj2 = {
  a: 1,
  b: 2
};
var obj3 = {
  b: 2,
  c: 3
};
var obj4 = {
  a: 1,
  b: 2,
  c: 3
};


// For dispaly purposes
document.write('<pre>' + JSON.stringify({
  obj1: {
    hasA: obj1.hasOwnProperty('a'),
    hasB: obj1.hasOwnProperty('b'),
    hasC: obj1.hasOwnProperty('c')
  },
  obj2: {
    hasA: obj2.hasOwnProperty('a'),
    hasB: obj2.hasOwnProperty('b'),
    hasC: obj2.hasOwnProperty('c')
  },
  obj3: {
    hasA: obj3.hasOwnProperty('a'),
    hasB: obj3.hasOwnProperty('b'),
    hasC: obj3.hasOwnProperty('c')
  },
  obj4: {
    hasA: obj4.hasOwnProperty('a'),
    hasB: obj4.hasOwnProperty('b'),
    hasC: obj4.hasOwnProperty('c')
  }
}, null, 2) + '</pre>');

person Jason Cust    schedule 18.08.2016
comment
@dandavis อะไรนะ? ถ้ามีใครทำแบบนั้น พวกเขาก็สมควรได้รับนรกขุมที่ 7 ที่พวกเขาพบว่าตัวเองอยู่ในนั้น - person Jason Cust; 18.08.2016
comment
ฉันก็คิดอย่างนั้นเหมือนกัน จนกระทั่งฉันพบมันในป่าบนสเปรดชีต Excel เกี่ยวกับอสังหาริมทรัพย์ที่ถูกแปลงเป็น JSON มันไม่ใช่ฟังก์ชั่น ดังนั้นมันจึงแค่โยนทิ้ง แต่มันทำให้ฉันสุดยอดมากเกี่ยวกับการตรวจสอบความเป็นสมาชิกของวัตถุ... - person dandavis; 18.08.2016

ใช้คีย์เวิร์ด in:

"key" in object

ซึ่งส่งคืน true หรือ false ขึ้นอยู่กับว่าวัตถุหรือสิ่งอื่นใดในสายโซ่ต้นแบบมีคุณสมบัตินั้นหรือไม่

คุณยังสามารถใช้ object.hasOwnProperty("key") ซึ่ง จะเป็น true เท่านั้นหากวัตถุมี key เป็นคุณสมบัติของตัวมันเอง ไม่ใช่ต้นแบบ ตัวอย่าง:

var object = {};
"toString" in object; // true
object.hasOwnProperty("toString"); // false

หมายเหตุ (ตามความคิดเห็นของ @ dandavis) ว่าหาก object มีคุณสมบัติที่กำหนดเองที่เรียกว่า hasOwnProperty สิ่งนี้จะถูกขัดขวาง เพื่อแก้ไขปัญหานี้ ให้ใช้ hasOwnProperty.call(object, "key") ตัวอย่าง:

var a = {hasOwnProperty: Boolean};
a.hasOwnProperty('name'); // true
hasOwnProperty.call(a, 'name'); // false
person qxz    schedule 18.08.2016

คุณสามารถใช้การกำหนดการทำลายล้างได้ หากไม่ได้กำหนดค่าไว้ ตัวแปรจะถูกตั้งค่าเป็น undefined คุณยังสามารถตรวจสอบว่ามีการกำหนดตัวแปรหลังจากการทำลายโครงสร้างแล้วจึง delete ตัวแปรตามการอ้างอิง

var data = {a:1, b:2, c:3};

var {a, b, c, d} = data; // `d`: `undefined`
person guest271314    schedule 18.08.2016
comment
โปรดทราบว่านี่เป็นคุณสมบัติ ES6 และไม่มีการรองรับอย่างกว้างขวาง: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ - person csander; 18.08.2016
comment
มันเรียบร้อยและสะอาดจริงๆ แต่ฉันไม่คิดว่ามันจะเป็นสิ่งที่ OP ต้องการอย่างแน่นอนเพราะมันซับซ้อนพอๆ กัน (ถ้าไม่มากกว่านั้น) ในการตรวจสอบคำศัพท์ในฐานะสมาชิก - person dandavis; 18.08.2016

person    schedule
comment
Object.keys+forEach ทำงานได้ดี แต่ช้ากว่าการกรอง for-in สำหรับวัตถุขนาดใหญ่มาก... - person dandavis; 18.08.2016
comment
อย่าใช้วัตถุขนาดใหญ่ ;) - person cstuncsik; 18.08.2016