หากมีวัตถุ Javascript:
var objects={...};
สมมติว่ามันมีคุณสมบัติมากกว่า 50 รายการโดยไม่ทราบชื่อคุณสมบัติ (นั่นคือโดยไม่รู้ตัว 'คีย์') วิธีรับค่าคุณสมบัติแต่ละค่าในลูป
หากมีวัตถุ Javascript:
var objects={...};
สมมติว่ามันมีคุณสมบัติมากกว่า 50 รายการโดยไม่ทราบชื่อคุณสมบัติ (นั่นคือโดยไม่รู้ตัว 'คีย์') วิธีรับค่าคุณสมบัติแต่ละค่าในลูป
คำตอบ:
โดยใช้การfor..in
วนรอบง่าย:
for(var key in objects) {
var value = objects[key];
}
enumerable
ตั้งค่าสถานะเป็นเท็จ สิ่งนี้หมายถึงคุณจะไม่ทำซ้ำในวิธีการเรียนใด ๆ แต่คุณจะทำซ้ำมากกว่าวิธีที่สร้างในวิธีอื่น
ขึ้นอยู่กับเบราว์เซอร์ที่คุณต้องรองรับสิ่งนี้สามารถทำได้หลายวิธี ส่วนใหญ่ที่ครอบงำของเบราว์เซอร์ในการสนับสนุนป่า ECMAScript 5 (ES5) แต่ได้รับการเตือนว่าหลายตัวอย่างด้านล่างใช้Object.keys
ซึ่งไม่สามารถใช้ได้ใน IE < 9. เห็นตารางการทำงานร่วมกัน
หากคุณต้องรองรับ IE เวอร์ชันเก่ากว่านี้เป็นตัวเลือกสำหรับคุณ:
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
var val = obj[key];
// use val
}
}
ซ้อนกันif
ทำให้แน่ใจว่าคุณไม่ได้ระบุคุณสมบัติในห่วงโซ่ต้นแบบของวัตถุ (ซึ่งเป็นพฤติกรรมที่คุณต้องการได้อย่างแน่นอน) คุณต้องใช้
Object.prototype.hasOwnProperty.call(obj, key) // ok
ค่อนข้างมากกว่า
obj.hasOwnProperty(key) // bad
เนื่องจาก ECMAScript 5+ ช่วยให้คุณสามารถสร้างวัตถุต้นแบบด้วยObject.create(null)
และวัตถุเหล่านี้จะไม่มีhasOwnProperty
วิธี รหัส Naughty อาจสร้างวัตถุที่แทนที่hasOwnProperty
วิธีการ
คุณสามารถใช้วิธีการเหล่านี้ในเบราว์เซอร์ที่รองรับ ECMAScript 5 ขึ้นไป สิ่งเหล่านี้จะได้รับค่าจากวัตถุและหลีกเลี่ยงการแจกแจงต้นแบบลูกโซ่ obj
วัตถุของคุณอยู่ที่ไหน:
var keys = Object.keys(obj);
for (var i = 0; i < keys.length; i++) {
var val = obj[keys[i]];
// use val
}
ถ้าคุณต้องการบางสิ่งที่เล็กกะทัดรัดกว่าหรือคุณต้องการระวังฟังก์ชั่นในลูปArray.prototype.forEach
นั่นคือเพื่อนของคุณ:
Object.keys(obj).forEach(function (key) {
var val = obj[key];
// use val
});
วิธีการถัดไปจะสร้างอาร์เรย์ที่มีค่าของวัตถุ สะดวกสำหรับการวนซ้ำ
var vals = Object.keys(obj).map(function (key) {
return obj[key];
});
// use vals array
หากคุณต้องการที่จะทำให้ผู้ที่ใช้Object.keys
กับความปลอดภัยnull
(ในฐานะfor-in
เป็น) Object.keys(obj || {})...
จากนั้นคุณสามารถทำได้
Object.keys
ส่งคืนคุณสมบัติที่นับได้ สำหรับการวนซ้ำวัตถุอย่างง่ายมักจะเพียงพอ ถ้าคุณมีบางสิ่งบางอย่างที่มีคุณสมบัติที่ไม่นับว่าคุณจะต้องทำงานร่วมกับคุณอาจจะใช้ในสถานที่ของObject.getOwnPropertyNames
Object.keys
อาร์เรย์ง่ายกว่าในการวนซ้ำกับ ECMAScript 2015 คุณสามารถใช้สิ่งนี้เพื่อประโยชน์ของคุณเมื่อทำงานกับค่าหนึ่งต่อหนึ่งในลูป:
for (const key of Object.keys(obj)) {
const val = obj[key];
// use val
}
การใช้ฟังก์ชั่นลูกศรอ้วน ECMAScript 2015 การจับคู่วัตถุกับอาร์เรย์ของค่าจะกลายเป็นหนึ่งซับ:
const vals = Object.keys(obj).map(key => obj[key]);
// use vals array
ECMAScript 2015 แนะนำSymbol
อินสแตนซ์ซึ่งอาจใช้เป็นชื่อคุณสมบัติ ในการรับสัญลักษณ์ของวัตถุให้แจกแจงใช้Object.getOwnPropertySymbols
(ฟังก์ชั่นนี้คือเหตุผลที่Symbol
ไม่สามารถใช้เพื่อสร้างคุณสมบัติส่วนตัว) Reflect
API ใหม่จาก ECMAScript 2015 จัดทำReflect.ownKeys
ขึ้นซึ่งจะส่งคืนรายการชื่อคุณสมบัติ (รวมถึงชื่อที่ไม่สามารถนับได้) และสัญลักษณ์
ความเข้าใจในอาร์เรย์ถูกลบออกจาก ECMAScript 6 ก่อนที่จะเผยแพร่ ก่อนที่จะนำออกโซลูชันจะมีลักษณะดังนี้:
const vals = [for (key of Object.keys(obj)) obj[key]];
// use vals array
ECMAScript 2016 เพิ่มคุณสมบัติที่ไม่ส่งผลกระทบต่อเรื่องนี้ ECMAScript 2017 สเปคเพิ่มและObject.values
Object.entries
ทั้งสองอาร์เรย์ส่งคืน (ซึ่งจะน่าแปลกใจที่บางคนได้รับการเปรียบเทียบกับArray.entries
) Object.values
สามารถใช้ตามสภาพที่เป็นหรือมีfor-of
ลูป
const values = Object.values(obj);
// use values array or:
for (const val of Object.values(obj)) {
// use val
}
หากคุณต้องการใช้ทั้งคีย์และค่าดังนั้นจึงObject.entries
เหมาะสำหรับคุณ มันผลิตอาร์เรย์ที่เต็มไปด้วย[key, value]
คู่ คุณสามารถใช้สิ่งนี้ตามที่เป็นอยู่หรือ (โปรดทราบการมอบหมายการทำลายล้าง ECMAScript 2015) ในการfor-of
วนซ้ำ:
for (const [key, val] of Object.entries(obj)) {
// use key and val
}
Object.values
ชิมในที่สุดตามที่ระบุไว้ในความคิดเห็นและโดย teh_senaus ในคำตอบอื่นมันอาจจะคุ้มค่าโดยใช้อย่างใดอย่างหนึ่งเหล่านี้เป็นชิม ไม่ต้องกังวลต่อไปนี้จะไม่เปลี่ยนต้นแบบเพียงเพิ่มวิธีการObject
(ซึ่งอันตรายน้อยกว่ามาก) การใช้ฟังก์ชั่นลูกศรไขมันสามารถทำได้ในหนึ่งบรรทัดด้วย:
Object.values = obj => Object.keys(obj).map(key => obj[key]);
ซึ่งตอนนี้คุณสามารถใช้เช่น
// ['one', 'two', 'three']
var values = Object.values({ a: 'one', b: 'two', c: 'three' });
หากคุณต้องการหลีกเลี่ยงการแรเงาเมื่อมีObject.values
อยู่แล้วคุณสามารถทำได้:
Object.values = Object.values || (obj => Object.keys(obj).map(key => obj[key]));
ระวังเบราว์เซอร์ / รุ่นที่คุณต้องการสนับสนุน ด้านบนถูกต้องเมื่อมีการใช้วิธีการหรือคุณสมบัติภาษา ตัวอย่างเช่นการสนับสนุน ECMAScript 2015 ถูกปิดใช้งานตามค่าเริ่มต้นใน V8 จนกระทั่งเมื่อไม่นานมานี้เบราว์เซอร์ที่ขับเคลื่อนเช่น Chrome ควรหลีกเลี่ยงฟีเจอร์จาก ECMAScript 2015 จนกว่าเบราว์เซอร์ที่คุณต้องการสนับสนุนจะใช้งานคุณสมบัติที่คุณต้องการ หากคุณใช้Babelเพื่อรวบรวมรหัสของคุณไปยัง ECMAScript 5 คุณจะสามารถเข้าถึงคุณสมบัติทั้งหมดในคำตอบนี้
obj
สองครั้ง ฉันเดาการสร้างฟังก์ชั่นตัวช่วยไม่สามารถหลีกเลี่ยงได้? บางอย่างเช่นค่า (obj)
Object.values = obj => Object.keys(obj).map(key => obj[key]);
นี่คือฟังก์ชั่นที่นำกลับมาใช้ใหม่เพื่อรับค่าลงในอาร์เรย์ มันต้องคำนึงถึงต้นแบบด้วย
Object.values = function (obj) {
var vals = [];
for( var key in obj ) {
if ( obj.hasOwnProperty(key) ) {
vals.push(obj[key]);
}
}
return vals;
}
Object
ไม่ได้เป็นปัญหามากนัก ( Object.keys
เป็นเรื่องธรรมดาทั่วไป) คุณอาจกำลังคิดที่จะดัดแปลงต้นแบบของวัตถุ
hasOwnProperty()
? กุญแจจะวนซ้ำภายในวงของวัตถุนั้นไม่ได้รับทรัพย์สินได้อย่างไร
หากคุณมีสิทธิ์เข้าถึง Underscore.js คุณสามารถใช้_.values
ฟังก์ชันดังนี้:
_.values({one : 1, two : 2, three : 3}); // return [1, 2, 3]
หากคุณต้องการอาร์เรย์ของค่าจริงๆฉันพบว่าเครื่องนี้สะอาดกว่าการสร้างอาร์เรย์ที่มีห่วงสำหรับ ... ใน
ECMA 5.1+
function values(o) { return Object.keys(o).map(function(k){return o[k]}) }
เป็นที่น่าสังเกตว่าในกรณีส่วนใหญ่คุณไม่จำเป็นต้องมีค่ามากมายมันจะเร็วกว่าในการทำสิ่งนี้:
for(var k in o) something(o[k]);
สิ่งนี้ทำซ้ำผ่านคีย์ของ Object o ในแต่ละการวนซ้ำ k ถูกตั้งค่าเป็นคีย์ของ o
ES5 Object.keys
var a = { a: 1, b: 2, c: 3 };
Object.keys(a).map(function(key){ return a[key] });
// result: [1,2,3]
คุณสามารถวนลูปผ่านปุ่มต่างๆได้:
foo = {one:1, two:2, three:3};
for (key in foo){
console.log("foo["+ key +"]="+ foo[key]);
}
จะส่งออก:
foo[one]=1
foo[two]=2
foo[three]=3
สำหรับผู้ที่ปรับตัวคนแรก ๆ ในยุค CofeeScript นี่เป็นอีกสิ่งที่เทียบเท่ากับมัน
val for key,val of objects
ซึ่งอาจดีกว่านี้เพราะobjects
สามารถลดให้พิมพ์อีกครั้งและลดความสามารถในการอ่าน
objects[key] for key of objects
ใช้ polyfill เช่น:
if(!Object.values){Object.values=obj=>Object.keys(obj).map(key=>obj[key])}
จากนั้นใช้
Object.values(my_object)
3) กำไร!
ECMA2017 เป็นต้นไป:
Object.values(obj)
จะดึงค่าคุณสมบัติทั้งหมดเป็นอาร์เรย์
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values
เห็นได้ชัดว่าตามที่ฉันเพิ่งเรียนรู้นี่เป็นวิธีที่เร็วที่สุดที่จะทำ:
var objs = {...};
var objKeys = Object.keys(obj);
for (var i = 0, objLen = objKeys.length; i < objLen; i++) {
// do whatever in here
var obj = objs[objKeys[i]];
}
คำถามไม่ได้ระบุว่าต้องการคุณสมบัติที่สืบทอดและไม่สามารถนับได้เช่นกัน
มีคำถามเกี่ยวกับการรับทุกสิ่งคุณสมบัติที่สืบทอดและคุณสมบัติที่ไม่นับรวมที่ Google ไม่สามารถหาได้ง่าย
ทางออกของฉันคือ:
function getAllPropertyNames(obj) {
let result = new Set();
while (obj) {
Object.getOwnPropertyNames(obj).forEach(p => result.add(p));
obj = Object.getPrototypeOf(obj);
}
return [...result];
}
จากนั้นวนซ้ำพวกเขาเพียงแค่ใช้ for-of loop
ใช้: Object.values()
เราส่งผ่านวัตถุเป็นอาร์กิวเมนต์และรับค่าอาร์เรย์เป็นค่าส่งคืน
สิ่งนี้จะส่งคืนอาร์เรย์ของค่าคุณสมบัติที่นับได้ของวัตถุที่กำหนด คุณจะได้รับค่าเดียวกันโดยใช้การfor in
วนซ้ำ แต่ไม่มีคุณสมบัติในต้นแบบ ตัวอย่างนี้อาจทำให้สิ่งต่าง ๆ ชัดเจนขึ้น:
function person (name) {
this.name = name;
}
person.prototype.age = 5;
let dude = new person('dude');
for(let prop in dude) {
console.log(dude[prop]); // for in still shows age because this is on the prototype
} // we can use hasOwnProperty but this is not very elegant
// ES6 +
console.log(Object.values(dude));
// very concise and we don't show props on prototype
const object1 = {
a: 'somestring',
b: 42
};
for (let [key, value] of Object.entries(object1)) {
console.log(`${key}: ${value}`);
}
// expected output:
// "a: somestring"
// "b: 42"
// order is not guaranteed
นี่คือฟังก์ชั่นที่คล้ายกับ array_values ของ PHP ()
function array_values(input) {
var output = [], key = '';
for ( key in input ) { output[output.length] = input[key]; }
return output;
}
ต่อไปนี้เป็นวิธีรับค่าของวัตถุหากคุณใช้ ES6 หรือสูงกว่า:
Array.from(values(obj));
ตั้งแต่Object.values(<object>)
จะถูกสร้างขึ้นในES7 &
ก่อนที่จะรอให้เบราว์เซอร์ทั้งหมดให้การสนับสนุนคุณสามารถปิดภายในเบราว์เซอร์:
Object.vals=(o)=>(Object.values)?Object.values(o):Object.keys(o).map((k)=>o[k])
จากนั้น:
Object.vals({lastname:'T',firstname:'A'})
// ['T','A']
ฉันรู้ฉันสายเล็ก ๆ น้อย ๆ แต่ที่นี่เป็นShimใหม่ Firefox 47 Object.values
วิธี
Object.prototype.values = Object.prototype.values || function(obj) {
return this.keys(obj).map(function(key){
return obj[key];
});
};
Object.entries ทำในวิธีที่ดีกว่า
var dataObject = {"a":{"title":"shop"}, "b":{"title":"home"}}
Object.entries(dataObject).map(itemArray => {
console.log("key=", itemArray[0], "value=", itemArray[1])
})
const myObj = { a:1, b:2, c:3 }
รับค่าทั้งหมด:
วิธีที่สั้นที่สุด:
const myValues = Object.values(myObj)
const myValues = Object.keys(myObj).map(key => myObj[key])
var objects={...}; this.getAllvalues = function () {
var vls = [];
for (var key in objects) {
vls.push(objects[key]);
}
return vls;
}
ในการใช้ECMAScript5
keys = Object.keys(object);
มิฉะนั้นถ้าเบราว์เซอร์ของคุณไม่รองรับให้ใช้ที่รู้จักกันดี for..in loop
for (key in object) {
// your code here
}
object[key]
เพื่อรับค่าในลูป
for..in
(และ hasOwnProperty) ดังนั้นมันจึงไม่ได้รับอะไรเลย .. ฉันหวังว่า ECMAScript 5th จะเป็นตัวกำหนดObject.pairs
(และObject.items
สำหรับ[[key, value], ..]
) แต่อนิจจามันไม่ได้
ตอนนี้ผมใช้Dojo ToolkitObject.values
เนื่องจากเบราว์เซอร์รุ่นเก่าไม่สนับสนุน
require(['dojox/lang/functional/object'], function(Object) {
var obj = { key1: '1', key2: '2', key3: '3' };
var values = Object.values(obj);
console.log(values);
});
ผลผลิต:
['1', '2', '3']
ใช้
console.log(variable)
และถ้าคุณใช้ google chrome เปิดคอนโซลโดยใช้ Ctrl + Shift + j
ไปที่ >> คอนโซล