Es ist interessant, dass Menschen in diesen Antworten beide berührt Object.keys()
und for...of
sie 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...of
ein, Object
weil es kein Iterator ist, for...index
oder .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 Map
s 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 prototype
im 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.