Nếu có một đối tượng Javascript:
var objects={...};
Giả sử, nó có hơn 50 thuộc tính, mà không biết tên thuộc tính (mà không biết 'khóa') làm thế nào để có được mỗi giá trị thuộc tính trong một vòng lặp?
Nếu có một đối tượng Javascript:
var objects={...};
Giả sử, nó có hơn 50 thuộc tính, mà không biết tên thuộc tính (mà không biết 'khóa') làm thế nào để có được mỗi giá trị thuộc tính trong một vòng lặp?
Câu trả lời:
Bằng cách sử dụng một for..in
vòng lặp đơn giản :
for(var key in objects) {
var value = objects[key];
}
enumerable
cờ của chúng được đặt thành false. Điều này - trong số những thứ khác - có nghĩa là bạn sẽ không lặp lại bất kỳ phương thức lớp nào, nhưng bạn sẽ lặp lại các phương thức được tạo theo các cách khác.
Tùy thuộc vào trình duyệt nào bạn phải hỗ trợ, việc này có thể được thực hiện theo một số cách. Phần lớn các trình duyệt trong hỗ trợ tự nhiên ECMAScript 5 (ES5), nhưng được cảnh báo rằng nhiều ví dụ dưới đây sử dụngObject.keys
, không có sẵn trong IE <9. Xem bảng tương thích .
Nếu bạn phải hỗ trợ các phiên bản IE cũ hơn, thì đây là tùy chọn dành cho bạn:
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
var val = obj[key];
// use val
}
}
Lồng nhau if
đảm bảo rằng bạn không liệt kê các thuộc tính trong chuỗi nguyên mẫu của đối tượng (đó là hành vi mà bạn gần như chắc chắn muốn). Bạn phải dùng
Object.prototype.hasOwnProperty.call(obj, key) // ok
thay vì
obj.hasOwnProperty(key) // bad
bởi vì ECMAScript 5+ cho phép bạn tạo các đối tượng không nguyên mẫu Object.create(null)
và các đối tượng này sẽ không cóhasOwnProperty
phương thức. Mã nghịch ngợm cũng có thể tạo ra các đối tượng ghi đè hasOwnProperty
phương thức.
Bạn có thể sử dụng các phương thức này trong bất kỳ trình duyệt nào hỗ trợ ECMAScript 5 trở lên. Chúng nhận các giá trị từ một đối tượng và tránh liệt kê qua chuỗi nguyên mẫu. obj
Đối tượng của bạn ở đâu :
var keys = Object.keys(obj);
for (var i = 0; i < keys.length; i++) {
var val = obj[keys[i]];
// use val
}
Nếu bạn muốn một cái gì đó nhỏ gọn hơn một chút hoặc bạn muốn cẩn thận với các chức năng trong các vòng lặp, thì đó Array.prototype.forEach
là bạn của bạn:
Object.keys(obj).forEach(function (key) {
var val = obj[key];
// use val
});
Phương thức tiếp theo xây dựng một mảng chứa các giá trị của một đối tượng. Điều này là thuận tiện cho vòng lặp qua.
var vals = Object.keys(obj).map(function (key) {
return obj[key];
});
// use vals array
Nếu bạn muốn làm cho những người sử dụng Object.keys
an toàn chống lại null
(như for-in
hiện tại), thì bạn có thể làm Object.keys(obj || {})...
.
Object.keys
lợi nhuận đếm tài sản. Để lặp qua các đối tượng đơn giản, điều này thường là đủ. Nếu bạn có một cái gì đó với các thuộc tính không thể đếm được mà bạn cần phải làm việc với, bạn có thể sử dụng Object.getOwnPropertyNames
thay choObject.keys
.
Mảng dễ lặp lại hơn với ECMAScript 2015. Bạn có thể sử dụng điều này để lợi thế của bạn khi làm việc với các giá trị từng bước một trong vòng lặp:
for (const key of Object.keys(obj)) {
const val = obj[key];
// use val
}
Sử dụng các hàm mũi tên béo ECMAScript 2015, ánh xạ đối tượng vào một mảng các giá trị sẽ trở thành một lớp lót:
const vals = Object.keys(obj).map(key => obj[key]);
// use vals array
ECMAScript 2015 giới thiệu Symbol
, các trường hợp có thể được sử dụng làm tên thuộc tính. Để lấy các ký hiệu của một đối tượng để liệt kê, hãy sử dụng Object.getOwnPropertySymbols
(chức năng này là lý do tại sao Symbol
không thể được sử dụng để tạo các thuộc tính riêng tư). Reflect
API mới từ ECMAScript 2015 cung cấp Reflect.ownKeys
, trả về danh sách các tên thuộc tính (bao gồm cả tên không thể liệt kê) và các ký hiệu.
Hiểu mảng đã bị xóa khỏi ECMAScript 6 trước khi xuất bản. Trước khi loại bỏ chúng, một giải pháp sẽ có vẻ như:
const vals = [for (key of Object.keys(obj)) obj[key]];
// use vals array
ECMAScript 2016 bổ sung các tính năng không ảnh hưởng đến chủ đề này. Đặc điểm kỹ thuật ECMAScript 2017 thêm Object.values
và Object.entries
. Cả hai mảng trả về (sẽ gây ngạc nhiên cho một số tương tự với Array.entries
). Object.values
có thể được sử dụng như là hoặc với mộtfor-of
vòng lặp.
const values = Object.values(obj);
// use values array or:
for (const val of Object.values(obj)) {
// use val
}
Nếu bạn muốn sử dụng cả khóa và giá trị, thì đó Object.entries
là dành cho bạn. Nó tạo ra một mảng chứa đầy [key, value]
các cặp. Bạn có thể sử dụng điều này như là, hoặc (lưu ý cả nhiệm vụ hủy diệt ECMAScript 2015) trong một for-of
vòng lặp:
for (const [key, val] of Object.entries(obj)) {
// use key and val
}
Object.values
shimCuối cùng, như đã lưu ý trong các bình luận và bởi teh_senaus trong một câu trả lời khác, có thể đáng để sử dụng một trong số này như một shim. Đừng lo lắng, sau đây không thay đổi nguyên mẫu, nó chỉ thêm một phương thức vào Object
(ít nguy hiểm hơn nhiều). Sử dụng các hàm mũi tên béo, điều này cũng có thể được thực hiện trong một dòng:
Object.values = obj => Object.keys(obj).map(key => obj[key]);
mà bây giờ bạn có thể sử dụng như
// ['one', 'two', 'three']
var values = Object.values({ a: 'one', b: 'two', c: 'three' });
Nếu bạn muốn tránh làm mờ khi bản địa Object.values
tồn tại, thì bạn có thể làm:
Object.values = Object.values || (obj => Object.keys(obj).map(key => obj[key]));
Hãy nhận biết các trình duyệt / phiên bản bạn cần hỗ trợ. Trên đây là chính xác nơi các phương thức hoặc tính năng ngôn ngữ được thực hiện. Ví dụ: hỗ trợ cho ECMAScript 2015 đã bị tắt theo mặc định trong V8 cho đến gần đây, hỗ trợ cho các trình duyệt như Chrome. Nên tránh các tính năng từ ECMAScript 2015 cho đến khi các trình duyệt bạn định hỗ trợ triển khai các tính năng mà bạn cần. Nếu bạn sử dụng babel để biên dịch mã của bạn thành ECMAScript 5, thì bạn có quyền truy cập vào tất cả các tính năng trong câu trả lời này.
obj
hai lần. Tôi đoán việc tạo ra một chức năng trợ giúp là không thể tránh khỏi? Một cái gì đó như giá trị (obj).
Object.values = obj => Object.keys(obj).map(key => obj[key]);
Đây là một chức năng có thể tái sử dụng để nhận các giá trị vào một mảng. Nó có nguyên mẫu vào tài khoản quá.
Object.values = function (obj) {
var vals = [];
for( var key in obj ) {
if ( obj.hasOwnProperty(key) ) {
vals.push(obj[key]);
}
}
return vals;
}
Object
không phải là vấn đề lớn ( Object.keys
là một shim phổ biến), có lẽ bạn đang nghĩ đến việc sửa đổi nguyên mẫu Object.
hasOwnProperty()
? Làm thế nào khóa được lặp đi lặp lại trong vòng lặp của đối tượng đó không có thuộc tính?
Nếu bạn có quyền truy cập vào Underscore.js, bạn có thể sử dụng _.values
chức năng như thế này:
_.values({one : 1, two : 2, three : 3}); // return [1, 2, 3]
Nếu bạn thực sự muốn một mảng Giá trị, tôi thấy điều này sạch hơn là xây dựng một mảng với vòng lặp for ....
ECMA 5.1+
function values(o) { return Object.keys(o).map(function(k){return o[k]}) }
Điều đáng chú ý là trong hầu hết các trường hợp, bạn không thực sự cần một mảng các giá trị, sẽ nhanh hơn để làm điều này:
for(var k in o) something(o[k]);
Điều này lặp đi lặp lại trên các phím của Object o. Trong mỗi lần lặp k được đặt thành một khóa của 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]
sử dụng một polyfill như:
if(!Object.values){Object.values=obj=>Object.keys(obj).map(key=>obj[key])}
sau đó sử dụng
Object.values(my_object)
3) lợi nhuận!
ECMA2017 trở đi:
Object.values(obj)
sẽ lấy cho bạn tất cả các giá trị thuộc tính dưới dạng một mảng.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values
Rõ ràng - như tôi mới biết - đây là cách nhanh nhất để làm điều đó:
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]];
}
Câu hỏi không xác định liệu muốn sở hữu các thuộc tính thừa kế và không liệt kê hay không.
Có một câu hỏi để có được mọi thứ, các thuộc tính được thừa kế và các thuộc tính không thể đếm được cũng , mà Google không thể dễ dàng tìm thấy.
Giải pháp của tôi cho điều đó là:
function getAllPropertyNames(obj) {
let result = new Set();
while (obj) {
Object.getOwnPropertyNames(obj).forEach(p => result.add(p));
obj = Object.getPrototypeOf(obj);
}
return [...result];
}
Và sau đó lặp lại chúng, chỉ cần sử dụng vòng lặp for:
Sử dụng: Object.values()
, chúng ta truyền vào một đối tượng làm đối số và nhận một mảng các giá trị dưới dạng giá trị trả về.
Điều này trả về một mảng của một đối tượng nhất định sở hữu các giá trị thuộc tính. Bạn sẽ nhận được các giá trị giống như bằng cách sử dụng for in
vòng lặp nhưng không có các thuộc tính trên Nguyên mẫu. Ví dụ này có thể sẽ làm cho mọi thứ rõ ràng hơn:
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
Đây là một hàm tương tự như Array_values () của PHP
function array_values(input) {
var output = [], key = '';
for ( key in input ) { output[output.length] = input[key]; }
return output;
}
Đây là cách nhận các giá trị của đối tượng nếu bạn đang sử dụng ES6 trở lên:
Array.from(values(obj));
Vì, Object.values(<object>)
sẽ được tích hợp sẵn trong ES7 &
Cho đến khi chờ tất cả các trình duyệt hỗ trợ nó, bạn có thể gói nó bên trong một chức năng:
Object.vals=(o)=>(Object.values)?Object.values(o):Object.keys(o).map((k)=>o[k])
Sau đó :
Object.vals({lastname:'T',firstname:'A'})
// ['T','A']
Object.entries làm điều đó theo cách tốt hơn.
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 }
Nhận tất cả các giá trị:
con đường ngắn nhất:
const myValues = Object.values(myObj)
const myValues = Object.keys(myObj).map(key => myObj[key])
trong ECMAScript5 sử dụng
keys = Object.keys(object);
Nếu không, nếu trình duyệt của bạn không hỗ trợ nó, hãy sử dụng trình duyệt nổi tiếng for..in loop
for (key in object) {
// your code here
}
object[key]
để lấy các giá trị trong một vòng lặp.
for..in
(và hasOwnProperty) vì vậy nó không thực sự đạt được bất cứ điều gì .. Tôi ước rằng ECMAScript 5 được định nghĩa Object.pairs
(và Object.items
cho [[key, value], ..]
), nhưng than ôi, nó không.
Bây giờ tôi sử dụng Bộ công cụ Dojo vì các trình duyệt cũ hơn không hỗ trợ Object.values
.
require(['dojox/lang/functional/object'], function(Object) {
var obj = { key1: '1', key2: '2', key3: '3' };
var values = Object.values(obj);
console.log(values);
});
Đầu ra:
['1', '2', '3']
sử dụng
console.log(variable)
và nếu bạn sử dụng google chrome mở Bảng điều khiển bằng cách sử dụng Ctrl + Shift + j
Goto >> Bảng điều khiển