ถ้าฉันมีวัตถุ JS เช่น:
var foo = { 'bar' : 'baz' }
หากฉันรู้ว่าfoo
มีโครงสร้างคีย์ / ค่าพื้นฐาน แต่ไม่ทราบชื่อของคีย์วิธีที่ง่ายที่สุดในการรับคืออะไร for ... in
? $.each()
? ฉันหวังว่าจะมีสิ่งที่ดีกว่า ....
ถ้าฉันมีวัตถุ JS เช่น:
var foo = { 'bar' : 'baz' }
หากฉันรู้ว่าfoo
มีโครงสร้างคีย์ / ค่าพื้นฐาน แต่ไม่ทราบชื่อของคีย์วิธีที่ง่ายที่สุดในการรับคืออะไร for ... in
? $.each()
? ฉันหวังว่าจะมีสิ่งที่ดีกว่า ....
คำตอบ:
หากคุณต้องการที่จะได้รับกุญแจทั้งหมด, ECMAScript 5 Object.keys
แนะนำ สิ่งนี้ได้รับการสนับสนุนโดยเบราว์เซอร์ที่ใหม่กว่า แต่เอกสารประกอบของ MDC นั้นมีการใช้งานทางเลือก (ซึ่งใช้for...in
btw)
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
ให้กุญแจแก่ฉัน แต่ฉันจะรับค่าของกุญแจได้อย่างไร ขอบคุณ
คุณจะวนซ้ำภายในวัตถุด้วยการวนรอบ:
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_"
อะไร
foo[i]
ถ้าi
เป็นsome string
ล่ะ
คุณสามารถเข้าถึงแต่ละคีย์แยกกันได้โดยไม่ต้องวนซ้ำใน:
var obj = { first: 'someVal', second: 'otherVal' };
alert(Object.keys(obj)[0]); // returns first
alert(Object.keys(obj)[1]); // returns second
const [firstKey, ...rest] = Object.keys(obj);
ให้วัตถุของคุณ:
var foo = { 'bar' : 'baz' }
ที่จะได้รับbar
ใช้:
Object.keys(foo)[0]
ที่จะได้รับbaz
ใช้:
foo[Object.keys(foo)[0]]
สมมติว่าเป็นวัตถุเดียว
หนึ่งซับสำหรับคุณ:
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
นี่เป็นวิธีที่ง่ายและสะดวกที่สุด นี่คือวิธีที่เราทำ
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(obj) // ['bar']
ตอนนี้คุณสามารถทำซ้ำในวัตถุและสามารถเข้าถึงค่าเช่นด้านล่าง -
Object.keys(obj).forEach( function(key) {
console.log(obj[key]) // baz
})
TypeError
หากคุณคาดหวังว่ากุญแจจะเป็นตัวเลข เพราะกุญแจเป็นสตริงเสมอ
ฉันมีปัญหาเดียวกันและนี่คือสิ่งที่ทำงาน
//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;
var value = person[key];
? ด้วยวิธีนี้คุณไม่จำเป็นต้องรู้กุญแจสำคัญของค่าที่คุณต้องการดึง
// 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
for (var key in foo)
ฉันไม่เห็นอะไรอย่างอื่นมากกว่า
วิธีที่ง่ายที่สุดคือการใช้ Underscore.js:
กุญแจ
_.keys (วัตถุ) ดึงชื่อทั้งหมดของคุณสมบัติของวัตถุ
_.keys ({หนึ่ง: 1, สอง: 2, สาม: 3}); => ["หนึ่ง", "สอง", "สาม"]
ใช่คุณต้องการห้องสมุดเพิ่มเติม แต่มันง่ายมาก!
for ... in
มีวิธีอื่นที่ไม่ใช่ไม่มี หากคุณไม่ต้องการใช้สิ่งนั้น (อาจเป็นเพราะการที่ไม่มีประสิทธิภาพในการทดสอบhasOwnProperty
ซ้ำแต่ละครั้ง?) ให้ใช้โครงสร้างที่แตกต่างกันเช่นอาร์เรย์ของ kvp:
[{ key: 'key', value: 'value'}, ...]
เมื่อคุณพูดถึงต่อ$.each()
ไปนี้เป็นวิธีที่สะดวกที่จะทำงานใน jQuery 1.6+:
var foo = { key1: 'bar', key2: 'baz' };
// keys will be: ['key1', 'key2']
var keys = $.map(foo, function(item, key) {
return key;
});
Object.keys () วิธีการ Object.keys () ส่งกลับอาร์เรย์ของคุณสมบัติที่นับได้ของวัตถุที่กำหนดในลำดับเดียวกับที่ให้โดยสำหรับ ... ในวง (ความแตกต่างที่เป็นห่วงในการระบุคุณสมบัติ ในห่วงโซ่ต้นแบบเช่นกัน)
var arr1 = Object.keys(obj);
Object.values () วิธีการ Object.values () ส่งกลับอาร์เรย์ของค่าคุณสมบัติที่นับได้เองของวัตถุที่กำหนดในลำดับเดียวกับที่ให้โดยสำหรับ ... ในวง (ความแตกต่างที่ห่วงใน forum ระบุ คุณสมบัติในห่วงโซ่ต้นแบบเช่นกัน)
var arr2 = Object.values(obj);
เพิ่มเติมได้ที่นี่
ใช้สำหรับแต่ละวงวนเพื่อเข้าถึงคีย์ในวัตถุหรือแผนที่ในจาวาสคริปต์
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);
มันจะให้ผลลัพธ์แบบนี้กับคุณ:
[บาร์];
ดี$.each
คือสร้างห้องสมุดในขณะที่for ... in
เป็น js พื้นเมืองซึ่งควรจะดีกว่า
คุณสามารถใช้ฟังก์ชัน Object.keys เพื่อรับคีย์เช่น:
const tempObjects={foo:"bar"}
Object.keys(tempObjects).forEach(obj=>{
console.log("Key->"+obj+ "value->"+tempObjects[obj]);
});
สำหรับการแสดงเป็นสตริงให้ใช้:
console.log("they are: " + JSON.stringify(foo));
วิธีที่ดีที่สุดในการรับคีย์ / ค่าของวัตถุ
let obj = {
'key1': 'value1',
'key2': 'value2',
'key3': 'value3',
'key4': 'value4'
}
Object.keys(obj).map(function(k){
console.log("key with value: "+k +" = "+obj[k])
})