Es ist interessant, dass Menschen in diesen Antworten beide berührt Object.keys()und for...ofsie nie kombiniert haben:
var map = {well:'hello', there:'!'};
for (let key of Object.keys(map))
console.log(key + ':' + map[key]);
Sie können nicht einfach for...ofein, Objectweil es kein Iterator ist, for...indexoder .forEach()das Object.keys()ist hässlich / ineffizient.
Ich bin froh, dass die meisten Leute davon Abstand nehmen for...in(mit oder ohne Überprüfung .hasOwnProperty()), da dies auch etwas chaotisch ist. Abgesehen von meiner obigen Antwort bin ich hier, um zu sagen ...
Sie können gewöhnliche Objektassoziationen iterieren lassen! Benimm dich wie Maps mit direkter Verwendung des ausgefallenen for...of
DEMO , das in Chrome und FF funktioniert (ich nehme nur ES6 an)
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);
Solange Sie meine Unterlegscheibe unten angeben:
//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;
}};
};
Ohne ein echtes Map-Objekt erstellen zu müssen, das nicht den schönen syntaktischen Zucker enthält.
var trueMap = new Map([['well', 'hello'], ['there', '!']]);
for (let pair of trueMap)
console.log(pair[0] + ':' + pair[1]);
Wenn Sie mit diesem Shim die anderen Funktionen von Map nutzen möchten (ohne sie alle einzuschränken), aber dennoch die saubere Objektnotation verwenden möchten, da Objekte jetzt iterierbar sind, können Sie jetzt einfach eine Map daraus erstellen!
//shown in demo
var realMap = new Map({well:'hello', there:'!'});
Für diejenigen, die nicht gerne shimen oder sich prototypeim Allgemeinen damit anlegen, können Sie die Funktion stattdessen im Fenster ausführen und sie so etwas wie getObjIterator()damals nennen.
//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;
}
Jetzt können Sie es einfach als normale Funktion aufrufen, nichts anderes ist betroffen
var realMap = new Map(getObjIterator({well:'hello', there:'!'}))
oder
for (let pair of getObjIterator(ordinaryObject))
Es gibt keinen Grund, warum das nicht funktionieren würde.
Willkommen in der Zukunft.