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 перечисляет свойства в цепочке прототипов как ну).
Я полагаю, вы это знаете 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 () отфильтровывает их.
ES6 предоставит карту.прототип.forEach (обратный вызов), который можно использовать следующим образом
myMap.forEach(function(value, key, myMap) {
// Do something
});
Ниже приведен пример, который становится как можно ближе.
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;