เป็นคนที่น่าสนใจในคำตอบเหล่านี้ได้สัมผัสทั้งสองอย่างObject.keys()
และfor...of
ไม่เคยรวมกัน:
var map = {well:'hello', there:'!'};
for (let key of Object.keys(map))
console.log(key + ':' + map[key]);
คุณก็ไม่สามารถเพราะมันไม่ได้เป็น iterator และหรือไอเอ็นจีน่าเกลียด / ไม่มีประสิทธิภาพ
ฉันดีใจที่ผู้คนส่วนใหญ่งดเว้นจาก(ไม่ว่าจะมีหรือไม่มีการตรวจสอบ) เนื่องจากมันค่อนข้างยุ่งดังนั้นนอกเหนือจากคำตอบของฉันด้านบนฉันมาที่นี่เพื่อพูด ...for...of
Object
for...index
.forEach()
Object.keys()
for...in
.hasOwnProperty()
คุณสามารถสร้างความสัมพันธ์ของวัตถุธรรมดาซ้ำได้! ทำตัวเหมือนกับMap
ใช้โดยตรงกับfor...of
DEMO แฟนซีที่ทำงานใน Chrome และ FF (ฉันถือว่า 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);
ตราบใดที่คุณรวม shim ของฉันด้านล่าง:
//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;
}};
};
โดยไม่ต้องสร้างวัตถุแผนที่จริงที่ไม่มีน้ำตาล syntactic ที่ดี
var trueMap = new Map([['well', 'hello'], ['there', '!']]);
for (let pair of trueMap)
console.log(pair[0] + ':' + pair[1]);
อันที่จริงแล้วด้วย shim นี้หากคุณยังต้องการใช้ประโยชน์จากฟังก์ชั่นอื่น ๆ ของ Map (โดยไม่ต้องปรับพวกมันทั้งหมด) แต่ยังต้องการใช้สัญกรณ์ที่เป็นระเบียบเพราะตอนนี้วัตถุสามารถทำซ้ำได้ตอนนี้คุณสามารถสร้างแผนที่จากมันได้!
//shown in demo
var realMap = new Map({well:'hello', there:'!'});
สำหรับผู้ที่ไม่ชอบที่จะชิมหรือยุ่งกับprototype
โดยทั่วไปรู้สึกอิสระที่จะทำให้การทำงานบนหน้าต่างแทนเรียกมันว่าสิ่งที่ต้องการgetObjIterator()
แล้ว;
//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;
}
ตอนนี้คุณสามารถเรียกมันว่าเป็นฟังก์ชั่นปกติไม่มีอะไรได้รับผลกระทบ
var realMap = new Map(getObjIterator({well:'hello', there:'!'}))
หรือ
for (let pair of getObjIterator(ordinaryObject))
ไม่มีเหตุผลว่าทำไมมันไม่ทำงาน
ยินดีต้อนรับสู่อนาคต