For..In-Schleifen in JavaScript - Schlüsselwertpaaren

414

Ich habe mich gefragt, ob es eine Möglichkeit gibt, so etwas wie eine PHP- foreachSchleife in JavaScript zu erstellen. Die Funktionalität, die ich suche, ist so etwas wie dieses PHP-Snippet:

foreach($data as $key => $value) { }

Ich habe mir die JS- for..inSchleife angesehen, aber es scheint keine Möglichkeit zu geben, die anzugeben as. Wenn ich dies mit einer 'normalen' for-Schleife ( for(var i = 0; i < data.length; i++) mache , gibt es eine Möglichkeit, die Schlüssel => Wertepaare zu erfassen?

Kabarett
quelle

Antworten:

214

Wenn Sie ES6 nativ oder mit Babel (js compiler) verwenden können, können Sie Folgendes tun:

const test = {a: 1, b: 2, c: 3};

for (const [key, value] of Object.entries(test)) {
  console.log(key, value);
}

Welches wird diese Ausgabe ausdrucken:

a 1
b 2
c 3

Die Object.entries()Methode gibt ein Array der eigenen aufzählbaren Eigenschaftspaare eines bestimmten Objekts [key, value]in derselben Reihenfolge zurück, die von einer for...inSchleife bereitgestellt wird (der Unterschied besteht darin, dass eine For-In-Schleife auch Eigenschaften in der Prototypkette auflistet) .

Ich hoffe es hilft! =)

Francesco Casula
quelle
1
Dies funktioniert perfekt, nur um sich zu wundern - im Vergleich zu "für Objekt eingeben und dann Wert für Objekt [Schlüssel] erhalten", welches bietet eine bessere Leistung?
lsheng
1
In diesem speziellen Fall würde ich annehmen, dass es aufgrund des Object.entriesAnrufs langsamer ist . Ich habe allerdings keine Tests durchgeführt.
Francesco Casula
6
Dies ist die beste Antwort auf die vorliegende Frage, bei der es darum ging, sowohl Schlüssel als auch Wert in der for-Schleife zu erfassen.
Cipak
4
Die akzeptierte Antwort sollte aktualisiert werden, da dies die Frage tatsächlich beantwortet, obwohl sie zum Zeitpunkt der Frage nicht verfügbar war.
Marc Qualie
1
Vielleicht möchten Sie diese Frage überprüfen: stackoverflow.com/questions/47213651/…, was darauf hindeutet, dass eine Syntax dieses Typs empfohlen wird: Object.keys (myObject) .forEach (key => {...
Will59
519
for (var k in target){
    if (target.hasOwnProperty(k)) {
         alert("Key is " + k + ", value is " + target[k]);
    }
}

hasOwnPropertywird verwendet, um zu überprüfen, ob Sie targetdiese Eigenschaft wirklich haben, anstatt sie von ihrem Prototyp geerbt zu haben. Ein bisschen einfacher wäre:

for (var k in target){
    if (typeof target[k] !== 'function') {
         alert("Key is " + k + ", value is" + target[k]);
    }
}

Es ist einfach überprüft , dass kkeine Methode ist (als ob targetist arrayes eine Menge von Methoden erhalten alarmierte, zum Beispiel indexOf, push, popusw.)

J0HN
quelle
87
Eine andere Möglichkeit, nur über "eigene" Eigenschaften zu iterieren, ist Object.keys. Object.keys(target).forEach(function (key) { target[key]; });.
Katspaugh
3
funktioniert nicht, wenn targetmit erstellt Object.create(null), Code sollte geändert werden target.hasOwnProperty(k)->Object.prototype.hasOwnProperty.call(target,k)
Azder
Warum nicht die im fraglichen Beispiel angegebenen Variablen verwenden? Was hier ist k, targetund property? Für mich, Nicht-Javascripter dieser Bereich von undefinierten :)
Gediminas
2
Object.keys (Ziel) .forEach ((Schlüssel) => {Ziel [Schlüssel];}); für Angular
Askilondz
315

Niemand hat es erwähnt, Object.keysalso werde ich es erwähnen.

Object.keys(obj).forEach(function (key) {
   // do something with obj[key]
});
Ziegenschläger
quelle
3
Hinweis: Wird von IE8 und niedriger nicht unterstützt.
Edwin Stoteler
1
Zu diesem Zeitpunkt sollten Sie eine ES5-Unterlegscheibe verwenden. Wenn Sie in der schönen ES6-Zukunft leben, verwenden Sie for of tc39wiki.calculist.org/es6/for-of
goatslacker
17
Es ist erwähnenswert, dass "es keine andere Möglichkeit gibt, eine forEach () - Schleife zu stoppen oder zu
unterbrechen,
Object.keys (obj) .forEach ((key) => {}); für Angular
askilondz
Es funktioniert nicht mit ES6 oder ich verstehe es nicht. Felix hat unten eine bessere und besser lesbare Antwort: data.forEach (Funktion (Wert, Index) {console.log (Index); // 0, 1, 2 ...});
gtamborero
115

denn ... in wird für dich arbeiten.

for( var key in obj ) {
  var value = obj[key];
}

In modernem JavaScript können Sie dies auch tun:

for ( const [key,value] of Object.entries( obj ) ) {

}
Paul
quelle
64
var obj = {...};
for (var key in obj) {
    var value = obj[key];

}

Die PHP-Syntax ist nur Zucker.

Zirak
quelle
Dies wird auch für alle geerbten Eigenschaften iteriert. Um dies zu vermeiden, verwenden Sie .hasOwnProperty ().
LSerni
24

Ich gehe davon aus, dass Sie wissen, dass dies ider Schlüssel ist und dass Sie den Wert über erhalten können data[i](und nur eine Verknüpfung dafür wünschen).

ECMAScript5 hat forEach [MDN] für Arrays eingeführt (anscheinend haben Sie ein Array):

data.forEach(function(value, index) {

});

Die MDN-Dokumentation bietet einen Shim für Browser, die ihn nicht unterstützen.

Natürlich funktioniert dies nicht für Objekte, aber Sie können eine ähnliche Funktion für sie erstellen:

function forEach(object, callback) {
    for(var prop in object) {
        if(object.hasOwnProperty(prop)) {
            callback(prop, object[prop]);
        }
    }
}

Da hast du die Frage mit getaggt jQuery stellt $.each [docs] bereit, die sowohl Array- als auch Objektstrukturen durchlaufen.

Felix Kling
quelle
Das ist Array forEach, kein Objekt forEach.
2
Damit? Anscheinend durchläuft das OP ein Array.
Felix Kling
Auch Mozilla (Firefox, SpiderMonkey-C, Rhino & c) hat eine nicht standardmäßige Erweiterung, die for eachSyntax erlaubt . for each (let val in myObj) console.log(val);.
Katspaugh
2
@katspaugh: Richtig, aber da es nur Mozilla ist, scheint es nicht sehr nützlich zu sein.
Felix Kling
Vielen Dank für Ihre Antwort. Ich werde die von Ihnen angegebenen Informationen durchlesen. Ihre Annahme zu Beginn der Antwort war richtig, das wusste ich, außer dass ich mit diesem Projekt so viel auf den Kopf gestellt habe, dass ich mich nicht konzentrieren kann und es vergessen habe. Danke.
Kabarett
10

Sie können das for..indafür verwenden.

for (var key in data)
{
    var value = data[key];
}
Christoph Winkler
quelle
9
for (var key in myMap) {
    if (myMap.hasOwnProperty(key)) {
        console.log("key =" + key);
        console.log("value =" + myMap[key]);
    }
}

In Javascript verfügt jedes Objekt über eine Reihe integrierter Schlüssel-Wert-Paare mit Metainformationen. Wenn Sie alle Schlüssel-Wert-Paare für ein Objekt durchlaufen, durchlaufen Sie auch diese. Die Verwendung von hasOwnProperty () filtert diese heraus.

Siddhu
quelle
2

ES6 stellt Map.prototype.forEach (Rückruf) zur Verfügung, das so verwendet werden kann

myMap.forEach(function(value, key, myMap) {
                        // Do something
                    });
Stephen Murby
quelle
2
Wofür ist der Parameter myMap?
Phil294
Eine Karte ist kein Objekt. Sie sind völlig getrennte Dinge.
Dakusan
2
Die forEach-Funktion enthält nicht den 'Schlüssel' des Arrays, sondern eher den Index des Elements, das Sie gerade iterieren.
Francis Malloch
2
let test = {a: 1, b: 2, c: 3};
Object.entries(test).forEach(([key, value]) => console.log(key, value))

// a 1
// b 2
// c 3
吴毅 凡
quelle
5
Sie können dem von Ihnen veröffentlichten Code eine Erklärung hinzufügen, anstatt einen einfachen Code zu veröffentlichen, der möglicherweise nicht verständlich ist.
AaoIi
Object.entries zieht ein Array von Arrays basierend auf den Schlüssel / Wert-Paaren des ursprünglichen Objekts heraus : [['a', 1],['b',2],['c',3]]. Das forEachdekonstruiert jedes der Schlüssel / Wert-Arrays und setzt die beiden Variablen auf keyund value, um so verwendet zu werden, wie Sie die in-Funktion möchten - hier wird in ausgegeben console.log.
Mark Swardstrom
1

Sie können hierfür eine 'for in'-Schleife verwenden:

for (var key in bar) {
     var value = bar[key];
}
Richard Dalton
quelle
1

Unten sehen Sie ein Beispiel, das so nah wie möglich kommt.

for(var key in data){
  var value = data[key];    
  //your processing here
}

Wenn Sie jQuery verwenden, lesen Sie: http://api.jquery.com/jQuery.each/

Aidamina
quelle
1

Wenn Sie Lodash verwenden , können Sie verwenden_.forEach

_.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
  console.log(key + ": " + value);
});
// => Logs 'a: 1' then 'b: 2' (iteration order is not guaranteed).
Gil Epshtain
quelle
1

In den letzten Jahren seit dieser Frage hat Javascript einige neue Funktionen hinzugefügt. Eine davon ist die Object.Entries- Methode.

Direkt aus MDN kopiert wird das folgende Code-Snippet


const object1 = {
  a: 'somestring',
  b: 42
};

for (let [key, value] of Object.entries(object1)) {
  console.log(`${key}: ${value}`);
}
David
quelle
-2

Ja, Sie können assoziative Arrays auch in Javascript verwenden:

var obj = 
{
    name:'some name',
    otherProperty:'prop value',
    date: new Date()
};
for(i in obj)
{
    var propVal = obj[i]; // i is the key, and obj[i] is the value ...
}
Alex Pacurar
quelle
@PaulPRO ... alles in Javascript ist ein Schlüssel-Wert-Paar (also ist ein Objekt tatsächlich ein assoziatives Array von Schlüssel-Wert-Paaren ...)
Alex Pacurar
@AlexPacurar und assocative Array hat eine Reihenfolge. Ein Objekt ist ungeordnet. Das ist ein großer Unterschied
Raynos
@ Raynos, Sie haben vielleicht Recht ... es wird eine große Hilfe sein, genau zu erklären, wie ein Objekt ungeordnet ist ... im obigen Beispiel würde man erwarten, dass das 'i' in der for-Schleife [name, otherProperty, und schließlich Datum] ... also in welcher Situation wird die Reihenfolge der Eigenschaften eines Objekts gemischt?
Alex Pacurar
@AlexPacurar Die bestimmte Reihenfolge, in der das Objekt durchlaufen wird, ist browserspezifisch. Einige machen es alphabetisch, andere machen es in der Reihenfolge der Definition usw.
Raynos
3
@ Raynos: Sind assoziative Arrays unbedingt geordnet? Ich habe oft gesehen, dass der Begriff allgemeiner verwendet wird. Zum Beispiel im Wikipedia-Artikel zum assoziativen Array .
Jeremy Banks
-8
var global = (function() {
   return this;
})();

// Pair object, similar to Python

function Pair(key, value) {
    this.key = key;
    this.value = value;

    this.toString = function() {
       return "(" + key + ", " + value + ")";
    };
}

/**
 * as function
 * @param {String} dataName A String holding the name of your pairs list.
 * @return {Array:Pair} The data list filled
 *    with all pair objects.
 */
Object.prototype.as = function(dataName) {
    var value, key, data;
    global[dataName] = data = [];

    for (key in this) {
       if (this.hasOwnProperty(key)) {
          value = this[key];

          (function() {
             var k = key,
                 v = value;

            data.push(new Pair(k, v));
          })();
       }
    }

    return data;
};

var d = {
   'one': 1,
   'two': 2
};

// Loop on your (key, list) pairs in this way
for (var i = 0, max = d.as("data").length; i < max; i += 1) {
   key = data[i].key;
   value = data[i].value;

   console.log("key: " + key + ", value: " + value);
}

// delete data when u've finished with it.
delete data;
user278064
quelle