Những người thú vị trong những câu trả lời này đã chạm vào cả hai Object.keys()
và for...of
nhưng không bao giờ kết hợp chúng:
var map = {well:'hello', there:'!'};
for (let key of Object.keys(map))
console.log(key + ':' + map[key]);
Bạn có thể không chỉ là for...of
một Object
vì nó không phải là một iterator, và for...index
hoặc .forEach()
ing Object.keys()
là xấu xí / không hiệu quả.
Tôi rất vui vì hầu hết mọi người đang kiềm chế for...in
(có hoặc không kiểm tra .hasOwnProperty()
) vì điều đó cũng hơi lộn xộn, vì vậy ngoài câu trả lời của tôi ở trên, tôi ở đây để nói ...
Bạn có thể làm cho các hiệp hội đối tượng bình thường lặp đi lặp lại! Hành xử giống như Map
s với việc sử dụng trực tiếp for...of
DEMO ưa thích hoạt động trong Chrome và FF (tôi chỉ giả sử ES6)
var ordinaryObject = {well:'hello', there:'!'};
for (let pair of ordinaryObject)
//key:value
console.log(pair[0] + ':' + pair[1]);
//or
for (let [key, value] of ordinaryObject)
console.log(key + ':' + value);
Miễn là bạn bao gồm shim của tôi dưới đây:
//makes all objects iterable just like Maps!!! YAY
//iterates over Object.keys() (which already ignores prototype chain for us)
Object.prototype[Symbol.iterator] = function() {
var keys = Object.keys(this)[Symbol.iterator]();
var obj = this;
var output;
return {next:function() {
if (!(output = keys.next()).done)
output.value = [output.value, obj[output.value]];
return output;
}};
};
Không cần phải tạo một đối tượng Map thực sự không có đường cú pháp đẹp.
var trueMap = new Map([['well', 'hello'], ['there', '!']]);
for (let pair of trueMap)
console.log(pair[0] + ':' + pair[1]);
Trên thực tế, với shim này, nếu bạn vẫn muốn tận dụng chức năng khác của Map (mà không làm mờ tất cả) nhưng vẫn muốn sử dụng ký hiệu đối tượng gọn gàng, vì giờ đây các đối tượng có thể lặp lại, bạn có thể tạo Bản đồ từ nó!
//shown in demo
var realMap = new Map({well:'hello', there:'!'});
Đối với những người không thích lung linh, hay prototype
nói chung, hãy thoải mái thực hiện chức năng trên cửa sổ thay vào đó, gọi nó là một cái gì đó như getObjIterator()
sau đó;
//no prototype manipulation
function getObjIterator(obj) {
//create a dummy object instead of adding functionality to all objects
var iterator = new Object();
//give it what the shim does but as its own local property
iterator[Symbol.iterator] = function() {
var keys = Object.keys(obj)[Symbol.iterator]();
var output;
return {next:function() {
if (!(output = keys.next()).done)
output.value = [output.value, obj[output.value]];
return output;
}};
};
return iterator;
}
Bây giờ bạn chỉ có thể gọi nó là một chức năng bình thường, không có gì khác bị ảnh hưởng
var realMap = new Map(getObjIterator({well:'hello', there:'!'}))
hoặc là
for (let pair of getObjIterator(ordinaryObject))
Không có lý do tại sao điều đó sẽ không làm việc.
Chào mừng đến với tương lai.