รับชื่อคุณสมบัติของวัตถุ


179

ฉันสงสัยว่ามีวิธีใดบ้างใน JavaScript ที่จะวนซ้ำวัตถุอย่างนั้น

for(var i in myObject) {
    // ...
}

แต่รับชื่อของแต่ละคุณสมบัติเช่นนี้

for(var i in myObject) {
    separateObj[myObject[i].name] = myObject[i];
}

ฉันดูเหมือนจะไม่พบสิ่งใดบน Google พวกเขาบอกว่าจะส่งชื่อตัวแปรกับพวกเขา แต่นี่ไม่ใช่ตัวเลือกสำหรับสิ่งที่ฉันพยายามบรรลุ

ขอบคุณสำหรับความช่วยเหลือใด ๆ ที่คุณสามารถนำเสนอ



4
seperateควรเป็นseparate
Juan Mendes

13
@JuanMendes ขอบคุณแก้ไขแล้ว ว้าวคำถามนี้เป็นการระเบิดจากอดีต ฉันมา'l' + new Array(1000).join('o') + 'ng'ตั้งแต่นั้น
Olical

1
คำตอบที่ตรวจสอบไม่ถูกต้องให้ใช้วิธีการ Object.keys ()
เควินฟลอริด้า

ตรวจสอบคำตอบและ Object.keys () สิ่งต่าง ๆ ทำดังนั้นขึ้นอยู่กับสิ่งที่คุณต้องการอย่างใดอย่างหนึ่งอาจจะถูกต้อง
Gabe Johnson

คำตอบ:


163

ใช้Object.keys ():

var myObject = { a: 'c', b: 'a', c: 'b' };
var keyNames = Object.keys(myObject);
console.log(keyNames); // Outputs ["a","b","c"]

Object.keys() ให้อาร์เรย์ของชื่อคุณสมบัติที่เป็นของวัตถุอินพุต


3
โดยเฉพาะอย่างยิ่ง Object.keys (obj) จะส่งคืนอาร์เรย์ของชื่อคุณสมบัติคือคีย์ซึ่งเป็นของผ่านใน obj
ผู้เรียนไม่มีชื่อ

1
นอกจากนี้ Object.keys () จะส่งคืนคุณสมบัติที่คาดเดาได้เท่านั้น Object.getOwnProperties () จะส่งคืนคุณสมบัติทั้งหมดของมัน
bitfishxyz

192

i คือชื่อ

for(var name in obj) {
    alert(name);
    var value = obj[name];
    alert(value);
}

ดังนั้นคุณสามารถทำได้:

seperateObj[i] = myObject[i];

1
คุณสมบัติของวัตถุสามารถเข้าถึงได้ผ่านทางไวยากรณ์ของวงเล็บ obj.prop1 เหมือนกับ obj ['prop1']
Josiah Ruddell

5
แนวทางปฏิบัติที่ดีคือการใช้HasOwnPropertyเมื่อใช้สำหรับ
.. ใน

5
@ Bakudan รู้ว่าคุณหมายถึงอะไร แต่วิธีที่ดีกว่าที่จะกล่าวคือคุณควรใช้hasOwnPropertyถ้าคุณไม่ต้องการคุณสมบัติที่สืบทอดมา ด้วยวิธีนี้คุณจะไม่ปฏิบัติตามกฎบางอย่าง อาจเป็นได้ว่าในบางกรณีคุณต้องการดูคุณสมบัติที่สืบทอดมา อีกวิธีหนึ่งที่จะห่วงผ่านคุณสมบัติของตัวเองของวัตถุที่ใช้Object.keys Object.keys(obj).forEach(function(prop){ alert obj[prop]})
Juan Mendes

@ Juan Mendes ใช่ฉันหมายถึงกรณีที่มีคุณสมบัติที่สืบทอดมา ฉันถูกบังคับ (เศร้า) ที่จะใช้วิธีนี้เนื่องจาก IE8 ไม่สนับสนุน Object.keys ...
Bakudan

17

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


ไม่วัตถุสามารถเชื่อมต่อกับคุณสมบัติหลาย ๆ อย่างได้ดังนั้นจึงไม่มีทางรู้ชื่อได้

var obj = {a:1};
var a = {x: obj, y: obj}

ชื่อของ obj คืออะไร?

แน่ใจหรือไม่ว่าคุณไม่ต้องการชื่อคุณสมบัติจาก for for loop

for (var propName in obj) {
  console.log("Iterating through prop with name", propName, " its value is ", obj[propName])
}

@ChadSchouggins สิ่งที่คุณพูดนั้นเป็นความจริง แต่นั่นไม่ใช่คำถามที่ฉันตอบเพราะใช่คุณสามารถวนลูปผ่านวัตถุเพื่อรับชื่อคุณสมบัติแต่ละชื่อ ฉันกำลังตอบคำถามที่อาจไม่ใช่สิ่งที่ OP ต้องการฉันแค่ต้องการชี้แจงว่าคุณสมบัติหลายอย่างสามารถชี้ไปที่วัตถุเดียวกันได้
Juan Mendes

7

คุณสามารถทำซ้ำในวัตถุได้อย่างง่ายดาย

เช่น: ถ้าวัตถุคือ var a = {a: 'apple', b: 'ball', c: 'cat', d: 'doll', e: 'elephant'};

Object.keys(a).forEach(key => {
   console.log(key) // returns the keys in an object
   console.log(a[key])  // returns the appropriate value 
})

6

สำหรับการเข้าถึงคุณสมบัติวัตถุโดยตรงตามตำแหน่ง ... โดยทั่วไปจะเป็นประโยชน์สำหรับคุณสมบัติ [0] ... ดังนั้นจึงเก็บข้อมูลเกี่ยวกับสิ่งต่อไป ... หรือใน node.js 'require.cache [0]' สำหรับโมดูลภายนอกที่โหลดครั้งแรก ฯลฯ

Object.keys( myObject )[ 0 ]
Object.keys( myObject )[ 1 ]
...
Object.keys( myObject )[ n ]

4

นอกเหนือจาก "Object.keys (obj)" เรามีง่ายมาก "สำหรับ ... ใน" ลูป - ซึ่งวนรอบชื่อคุณสมบัติของวัตถุที่นับได้

const obj = {"fName":"John","lName":"Doe"};

for (const key in obj) {
    //This will give key
      console.log(key);
    //This will give value
    console.log(obj[key]);
    
}


3

ในการรับคุณสมบัติของวัตถุหรือ "คีย์อาร์เรย์" หรือ "ดัชนีอาร์เรย์" ขึ้นอยู่กับว่าคุณใช้ภาษาพื้นเมืองของคุณคืออะไร ..... ใช้เมธอด Object.keys ()

สำคัญสิ่งนี้ใช้ได้เฉพาะกับ "เบราว์เซอร์สมัยใหม่" เท่านั้น:

ดังนั้นถ้าวัตถุของคุณถูกเรียก myObject ...

var c = 0;
for(c in myObject) {
    console.log(Object.keys(myObject[c]));
}

วาล! สิ่งนี้จะทำงานใน firefox ล่าสุดและ ie11 และ chrome ...

นี่คือเอกสารบางส่วนที่ MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys


2

ใน ES5

EG คุณมีวัตถุประเภทนี้:

var ELEMENTS = {
    STEP_ELEMENT: { ID: "0", imageName: "el_0.png" },
    GREEN_ELEMENT: { ID: "1", imageName: "el_1.png" },
    BLUE_ELEMENT: { ID: "2", imageName: "el_2.png" },
    ORANGE_ELEMENT: { ID: "3", imageName: "el_3.png" },
    PURPLE_ELEMENT: { ID: "4", imageName: "el_4.png" },
    YELLOW_ELEMENT: { ID: "5", imageName: "el_5.png" }
};

และตอนนี้ถ้าคุณต้องการมีฟังก์ชั่นที่ถ้าคุณผ่าน '0' เป็นพารามิเตอร์ - รับ 'STEP_ELEMENT' ถ้า '2' เพื่อรับ 'BLUE_ELEMENT' และอื่น ๆ

function(elementId) {
    var element = null;

    Object.keys(ELEMENTS).forEach(function(key) {
        if(ELEMENTS[key].ID === elementId.toString()){
            element = key;
            return;
        }    
    });

    return element;
}

นี่อาจไม่ใช่วิธีที่ดีที่สุดในการแก้ไขปัญหา แต่เป็นวิธีที่ดีที่จะให้แนวคิดแก่คุณในการทำเช่นนั้น

ไชโย


1

ตั้งแต่ปี 2018 คุณสามารถใช้ประโยชน์ได้Object.getOwnPropertyNames()ตามที่อธิบายไว้ในDeveloper Mozilla Documentation

const object1 = {
  a: 1,
  b: 2,
  c: 3
};

console.log(Object.getOwnPropertyNames(object1));
// expected output: Array ["a", "b", "c"]

0

เมื่อคุณทำเพื่อ / ในลูปที่คุณวางก่อนฉันเป็นชื่อคุณสมบัติ ดังนั้นคุณมีชื่อคุณสมบัติ i และเข้าถึงค่าโดยทำ myObject [i]


0

โซลูชั่นเหล่านี้ก็ทำงานเช่นกัน

// Solution One
function removeProperty(obj, prop) {
  var bool;
  var keys = Object.keys(obj);
  for (var i = 0; i < keys.length; i++) {
    if (keys[i] === prop) {
      delete obj[prop];
      bool = true;
    } 
  }
  return Boolean(bool);
}


//Solution two
function removeProperty(obj, prop) {
  var bool;
  if (obj.hasOwnProperty(prop)) {
      bool = true;
      delete obj[prop];
  }
  return Boolean(bool);
}

0

การใช้Object.keys()ฟังก์ชันสำหรับรับคุณสมบัติจากObjectและสามารถช่วยค้นหาคุณสมบัติตามชื่อตัวอย่างเช่น

const Products = function(){
    this.Product = "Product A";
    this.Price = 9.99;
    this.Quantity = 112;
};

// Simple find function case insensitive
let findPropByName = function(data, propertyName){
 let props = [];
 Object.keys(data).forEach(element => {
    return props.push(element.toLowerCase());
  });
  console.log(props);
  let i = props.indexOf(propertyName.toLowerCase());

  if(i > -1){
    return props[i];
  }
  return false;
};

// calling the function
let products = new Products();
console.log(findPropByName(products, 'quantity'));

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