Pentru..În bucle în JavaScript - perechi de valori-cheie

Mă întrebam dacă nu's o modalitate de a face ceva ca un PHP "foreach" buclă în JavaScript. Funcționalitatea I'm în căutarea pentru ceva de genul acesta PHP Fragment:

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

M-am uitat la JS pentru..în buclă, dar nu pare a fi nici o modalitate de a specifica "ca". Dacă am face acest lucru cu un &#39;normal&#39; pentru buclă (pentru(var i = 0; i < date.length; i++), există o modalitate de a apuca o cheie => perechi de valori?

for (var k in target){
    if (target.hasOwnProperty(k)) {
         alert("Key is " + k + ", value is " + target[k]);
    }
}

hasOwnProperty este folosit pentru a verifica dacă "țintă" are într-adevăr acea proprietate, mai degrabă decât au moștenit-o de la prototipul său. Un pic mai simplu ar fi:

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

Acesta verifică doar că " k "nu este o metoda (ca și în cazul "țintă" este "matrice" ai'll obține o mulțime de metode de a alertat, de exemplu, indexOf, "push", "pop", etc.)

Comentarii (4)

Nimeni nu a pomenit de Obiect.tastele așa că mi-am'll-l menționez.

Object.keys(obj).forEach(function (key) {
   // do something with obj[key]
});
Comentarii (6)
Soluția

Dacă puteți utiliza ES6 nativ sau cu Babel (js compiler), atunci ai putea face următoarele:

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

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

Care va imprima această ieșire:

a 1
b 2
c 3

Obiectul.intrări () metoda returnează o matrice de un obiect dat&#39;s propria enumerable proprietatea[cheie, valoare]pe perechi, în aceeași ordine ca cea oferită de unîn` bucla (diferența fiind că un pentru-în buclă enumeră proprietăți în lanț prototip precum).

Sper că vă ajută! =)

Comentarii (4)

în va lucra pentru tine.

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

În moderne JavaScript puteți, de asemenea, face acest lucru:

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

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

}

Sintaxa php este doar zahăr.

Comentarii (1)

Presupun că știi că " eu " este cheia și că puteți obține valoarea via a datelor[i] (și vreau doar o scurtătură pentru acest lucru).

ECMAScript5 introdus "forEach" [MDN] pentru tablouri (se pare că aveți o matrice):

data.forEach(function(value, index) {

});

MDN documentația oferă un shim pentru browsere nu o susțin.

Desigur, acest lucru nu funcționează pentru obiecte, dar puteți crea o funcție similară pentru ei:

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

Când ai etichetat întrebarea cu [tag:jquery], jQuery oferă $.fiecare [documente], care bucle pe ambele, matrice și obiect structuri.

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

În javascript, fiecare obiect are o grămadă de built-in de perechi cheie-valoare, care au meta-informații. Atunci când bucla prin toate perechi cheie-valoare pentru un obiect're looping prin ei. Utilizarea de hasOwnProperty() filtrele astea.

Comentarii (0)

Puteți folosi pentru..în` pentru asta.

for (var key in data)
{
    var value = data[key];
}
Comentarii (0)

ES6 va oferi Hartă.prototip.forEach(callback) care pot fi utilizate astfel de prognoze

myMap.forEach(function(value, key, myMap) {
                        // Do something
                    });
Comentarii (3)

Dacă utilizați Lodash, puteți utiliza _.forEach

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

Puteți utiliza un 'de la' bucla pentru acest lucru:

for (var key in bar) {
     var value = bar[key];
}
Comentarii (0)

Mai jos este un exemplu care devine la fel de aproape ca te.

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

Daca're folosind jQuery vedea: http://api.jquery.com/jQuery.each/

Comentarii (0)
let test = {a: 1, b: 2, c: 3};
Object.entries(test).forEach(([key, value]) => console.log(key, value))

// a 1
// b 2
// c 3
Comentarii (1)

da, puteți avea tablouri asociative, de asemenea, în javascript:

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 ...
}
Comentarii (5)
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;
Comentarii (0)