Sangat menarik bahwa orang-orang dalam jawaban ini menyentuh keduanya Object.keys()
dan for...of
tetapi tidak pernah menggabungkannya:
var map = {well:'hello', there:'!'};
for (let key of Object.keys(map))
console.log(key + ':' + map[key]);
Anda tidak bisa hanya for...of
sebuah Object
karena itu bukan iterator, dan for...index
atau .forEach()
ing Object.keys()
jelek / tidak efisien.
Saya senang kebanyakan orang menahan diri dari for...in
(dengan atau tanpa memeriksa .hasOwnProperty()
) karena itu juga agak berantakan, jadi selain jawaban saya di atas, saya di sini untuk mengatakan ...
Anda dapat membuat asosiasi objek biasa beralih! Berperilaku seperti Map
dengan penggunaan langsung dari mewahfor...of
DEMO bekerja di Chrome dan FF (saya berasumsi hanya 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);
Selama Anda memasukkan shim saya di bawah ini:
//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;
}};
};
Tanpa harus membuat objek Peta nyata yang tidak memiliki gula sintaksis yang bagus.
var trueMap = new Map([['well', 'hello'], ['there', '!']]);
for (let pair of trueMap)
console.log(pair[0] + ':' + pair[1]);
Faktanya, dengan shim ini, jika Anda masih ingin memanfaatkan fungsionalitas Map lainnya (tanpa mengurangi semuanya) tetapi masih ingin menggunakan notasi objek yang rapi, karena objek sekarang dapat diubah, Anda sekarang dapat membuat Peta darinya!
//shown in demo
var realMap = new Map({well:'hello', there:'!'});
Bagi mereka yang tidak suka shim, atau mengacaukan prototype
secara umum, jangan ragu untuk membuat fungsi di jendela, menyebutnya seperti getObjIterator()
itu;
//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;
}
Sekarang Anda bisa menyebutnya sebagai fungsi biasa, tidak ada yang terpengaruh
var realMap = new Map(getObjIterator({well:'hello', there:'!'}))
atau
for (let pair of getObjIterator(ordinaryObject))
Tidak ada alasan mengapa itu tidak berhasil.
Selamat datang di masa depan.