วิธีที่ดีที่สุดในการรับคีย์ของวัตถุ javascript คีย์ / ค่า


186

ถ้าฉันมีวัตถุ JS เช่น:

var foo = { 'bar' : 'baz' }

หากฉันรู้ว่าfooมีโครงสร้างคีย์ / ค่าพื้นฐาน แต่ไม่ทราบชื่อของคีย์วิธีที่ง่ายที่สุดในการรับคืออะไร for ... in? $.each()? ฉันหวังว่าจะมีสิ่งที่ดีกว่า ....


5
เกิดอะไรขึ้นกับ ... ใน?
Matt

1
มันรู้สึกทางอ้อมและคุณต้องใช้ hasOwnProperty ฉันเดาว่าฉันจะสร้างฟังก์ชั่นห้องสมุดที่ทำได้ ....
sprugman

คำตอบ:


93

หากคุณต้องการที่จะได้รับกุญแจทั้งหมด, ECMAScript 5 Object.keysแนะนำ สิ่งนี้ได้รับการสนับสนุนโดยเบราว์เซอร์ที่ใหม่กว่า แต่เอกสารประกอบของ MDC นั้นมีการใช้งานทางเลือก (ซึ่งใช้for...inbtw)

if(!Object.keys) Object.keys = function(o){
     if (o !== Object(o))
          throw new TypeError('Object.keys called on non-object');
     var ret=[],p;
     for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p);
     return ret;
}

แน่นอนถ้าคุณต้องการทั้งคีย์และค่าจากนั้นfor...inเป็นทางออกที่เหมาะสมเท่านั้น


pให้กุญแจแก่ฉัน แต่ฉันจะรับค่าของกุญแจได้อย่างไร ขอบคุณ
Si8

1
สำหรับทั้งคีย์และค่าใช้ Object.entries () developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ใหม่
Kzqai

อาจเป็นข้อบ่งชี้ถึงความเข้าใจที่ จำกัด ของฉัน แต่คำตอบนี้ดูเหมือนจะเป็นเรื่องที่ชัดเจนมาก @Michael Benin ไม่ควรตอบว่าเป็นคำตอบที่ดีที่สุดใช่หรือไม่
แอรอนแมตทิวส์

7
เอ่อ ... ไม่มีใครคลิกลิงค์แรกถูกเปลี่ยนเส้นทางไปยังยาเสพติดนิรนามหรือไม่
John Duskin

193

คุณจะวนซ้ำภายในวัตถุด้วยการวนรอบ:

for(var i in foo){
  alert(i); // alerts key
  alert(foo[i]); //alerts key's value
}

หรือ

Object.keys(foo)
  .forEach(function eachKey(key) { 
    alert(key); // alerts key 
    alert(foo[key]); // alerts value
  });

ถ้าฉันไม่ต้องการfoo[i]เป็น"_proto_"อะไร
user2284570


ถ้าฉันไม่ต้องการแจ้งเตือน () foo[i]ถ้าiเป็นsome stringล่ะ
2284570

@ user2284570: ฉันสามารถเป็นสตริงได้ - ไม่มีปัญหา
Gerfried

คุณไม่ได้หมายถึง (var i ใน Object.keys (foo)) {
samurai jack

103

คุณสามารถเข้าถึงแต่ละคีย์แยกกันได้โดยไม่ต้องวนซ้ำใน:

var obj = { first: 'someVal', second: 'otherVal' };
alert(Object.keys(obj)[0]); // returns first
alert(Object.keys(obj)[1]); // returns second

3
ตอนนี้คุณสามารถใช้โอเปอเรเตอร์สconst [firstKey, ...rest] = Object.keys(obj);
เปรด

65

ให้วัตถุของคุณ:

var foo = { 'bar' : 'baz' }

ที่จะได้รับbarใช้:

Object.keys(foo)[0]

ที่จะได้รับbazใช้:

foo[Object.keys(foo)[0]]

สมมติว่าเป็นวัตถุเดียว


27

หนึ่งซับสำหรับคุณ:

const OBJECT = {
    'key1': 'value1',
    'key2': 'value2',
    'key3': 'value3',
    'key4': 'value4'
};

const value = 'value2';

const key = Object.keys(OBJECT)[Object.values(OBJECT).indexOf(value)];

window.console.log(key); // = key2

26

นี่เป็นวิธีที่ง่ายและสะดวกที่สุด นี่คือวิธีที่เราทำ

var obj = { 'bar' : 'baz' }
var key = Object.keys(obj)[0];
var value = obj[key];
     
 console.log("key = ", key) // bar
 console.log("value = ", value) // baz
Object.keys () เป็นวิธีการจาวาสคริปต์ซึ่งส่งกลับอาร์เรย์ของคีย์เมื่อใช้กับวัตถุ

Object.keys(obj) // ['bar']

ตอนนี้คุณสามารถทำซ้ำในวัตถุและสามารถเข้าถึงค่าเช่นด้านล่าง -

Object.keys(obj).forEach( function(key) {
  console.log(obj[key]) // baz
})

คุณอาจได้รับTypeErrorหากคุณคาดหวังว่ากุญแจจะเป็นตัวเลข เพราะกุญแจเป็นสตริงเสมอ
สีเขียว

15

ฉันมีปัญหาเดียวกันและนี่คือสิ่งที่ทำงาน

//example of an Object
var person = {
    firstName:"John",
    lastName:"Doe",
    age:50,
    eyeColor:"blue"
};

//How to access a single key or value
var key = Object.keys(person)[0];
var value = person.firstName;

11
ทำไมไม่var value = person[key];? ด้วยวิธีนี้คุณไม่จำเป็นต้องรู้กุญแจสำคัญของค่าที่คุณต้องการดึง
Sean Kendle

14
// iterate through key-value gracefully
const obj = { a: 5, b: 7, c: 9 };
for (const [key, value] of Object.entries(obj)) {
  console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
}

อ้างอิง MDN



5

วิธีที่ง่ายที่สุดคือการใช้ Underscore.js:

กุญแจ

_.keys (วัตถุ) ดึงชื่อทั้งหมดของคุณสมบัติของวัตถุ

_.keys ({หนึ่ง: 1, สอง: 2, สาม: 3}); => ["หนึ่ง", "สอง", "สาม"]

ใช่คุณต้องการห้องสมุดเพิ่มเติม แต่มันง่ายมาก!


4
@ lonesomeday ใช่ แต่ขีดล่าง / lodash มีประโยชน์ในหลาย ๆ ทางดังนั้นมันจึงคุ้มค่าที่จะนำขึ้นมา
jcollum

4

for ... inมีวิธีอื่นที่ไม่ใช่ไม่มี หากคุณไม่ต้องการใช้สิ่งนั้น (อาจเป็นเพราะการที่ไม่มีประสิทธิภาพในการทดสอบhasOwnPropertyซ้ำแต่ละครั้ง?) ให้ใช้โครงสร้างที่แตกต่างกันเช่นอาร์เรย์ของ kvp:

[{ key: 'key', value: 'value'}, ...]

4

เมื่อคุณพูดถึงต่อ$.each()ไปนี้เป็นวิธีที่สะดวกที่จะทำงานใน jQuery 1.6+:

var foo = { key1: 'bar', key2: 'baz' };

// keys will be: ['key1', 'key2']
var keys = $.map(foo, function(item, key) {
  return key;
});

4

Object.keys () วิธีการ Object.keys () ส่งกลับอาร์เรย์ของคุณสมบัติที่นับได้ของวัตถุที่กำหนดในลำดับเดียวกับที่ให้โดยสำหรับ ... ในวง (ความแตกต่างที่เป็นห่วงในการระบุคุณสมบัติ ในห่วงโซ่ต้นแบบเช่นกัน)

var arr1 = Object.keys(obj);

Object.values ​​() วิธีการ Object.values ​​() ส่งกลับอาร์เรย์ของค่าคุณสมบัติที่นับได้เองของวัตถุที่กำหนดในลำดับเดียวกับที่ให้โดยสำหรับ ... ในวง (ความแตกต่างที่ห่วงใน forum ระบุ คุณสมบัติในห่วงโซ่ต้นแบบเช่นกัน)

var arr2 = Object.values(obj);

เพิ่มเติมได้ที่นี่


3

ใช้สำหรับแต่ละวงวนเพื่อเข้าถึงคีย์ในวัตถุหรือแผนที่ในจาวาสคริปต์

for(key in foo){
   console.log(key);//for key name in your case it will be bar
   console.log(foo[key]);// for key value in your case it will be baz
}

หมายเหตุ:คุณยังสามารถใช้

Object.keys (foo);

มันจะให้ผลลัพธ์แบบนี้กับคุณ:

[บาร์];



1

คุณสามารถใช้ฟังก์ชัน Object.keys เพื่อรับคีย์เช่น:

const tempObjects={foo:"bar"}

Object.keys(tempObjects).forEach(obj=>{
   console.log("Key->"+obj+ "value->"+tempObjects[obj]);
});


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