For..In петли в JavaScript-пары значений ключа

мне было интересно, есть ли способ сделать что-то вроде PHP foreach цикл в JavaScript. Функциональность, которую я ищу, - это что-то вроде этого фрагмента PHP:

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

Я смотрел на JS for..in цикл, но, похоже, нет способа указать as. Если я сделаю это с "нормальным" циклом for (for(var i = 0; i < data.length; i++), есть ли способ захватить пары key => value?

14 ответов


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

hasOwnProperty используется для проверки, если ваш target действительно имеет это свойство, а не унаследовав его от своего прототипа. Немного проще было бы:

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

он просто проверяет, что k не является методом (как если бы target is array вы получите много методов оповещения, например,indexOf, push, pop, etc.)


никто не упомянул Object.keys Так что я упомяну об этом.

Object.keys(obj).forEach(function (key) {
   // do something with obj[key]
});

на for in будет работать для вас. Если вы думаете об объекте как о карте:

for(key in obj){
    // The key is key
    // The value is obj[key]
}

если вы можете использовать ЕС6 нативно или с Бабель (компилятор js), то вы можете сделать следующее:

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

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

который распечатает этот вывод:

a 1
b 2
c 3

на Object.entries() метод возвращает массив собственного перечисляемого свойства данного объекта [key, value] пары, в том же порядке, что и в for...in цикл (разница в том, что цикл for-in перечисляет свойства в цепочке прототипов как ну).


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

}

синтаксис PHP-это просто сахар.


Я полагаю, вы это знаете i является ключом, и вы можете получить значение через data[i] (и просто ярлык для этого).

ECMAScript5 представил forEach [MDN] для массивов (кажется, у вас есть массив):

data.forEach(function(value, index) {

});

документация MDN предоставляет прокладку для браузеров, не поддерживающих ее.

конечно, это не работает для объектов, но вы можете создать аналогичную функцию для они:

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

так как вы пометили вопрос с в jQuery, в jQuery предоставляет $.each [docs] который петляет над обоими, массивом и структурами объектов.


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

в JavaScript каждый объект имеет кучу встроенных пар ключ-значение, которые имеют мета-информации. Когда вы перебираете все пары ключ-значение для объекта, Вы тоже перебираете их. Использование hasOwnProperty () отфильтровывает их.


можно использовать for..in для этого.

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

ES6 предоставит карту.прототип.forEach (обратный вызов), который можно использовать следующим образом

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

вы можете использовать цикл "for in" для этого:

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

Ниже приведен пример, который становится как можно ближе.

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

Если вы используете jQuery см.:http://api.jquery.com/jQuery.each/


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

// a 1
// b 2
// c 3

да, вы можете иметь ассоциативные массивы также в 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 ...
}

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;