我想知道是否有办法在JavaScript中做类似于PHPforeach
循环的事情。我正在寻找的功能是像这样的PHP片段。
foreach($data as $key => $value) { }
我在看JS的for...in
循环,但似乎没有办法指定as
。如果我用一个'正常的'for循环(for(var i = 0; i < data.length; i++
))来做,有没有办法抓取key => value对?
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'是array',你会得到很多方法的提示,例如
indexOf'、push'、
pop'等)。
没有人提到Object.keys
,所以我'提一下。
Object.keys(obj).forEach(function (key) {
// do something with obj[key]
});
如果你可以使用ES6原生或使用Babel(js编译器),那么你可以做如下操作。
<!--开始片段。 js hide: false console: true babel.false --> -- begin snippet: js hide: false console: true false -->
const test = {a: 1, b: 2, c: 3};
for (const [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文档为不支持它的浏览器提供了一个shim。
当然,这并不适用于对象,但你可以为它们创建一个类似的功能。
function forEach(object, callback) {
for(var prop in object) {
if(object.hasOwnProperty(prop)) {
callback(prop, object[prop]);
}
}
}
由于你用[tag:jquery]标记了这个问题,jQuery提供了[$.each
[docs]][2],它可以循环处理数组和对象结构。
1:
for (var key in myMap) {
if (myMap.hasOwnProperty(key)) {
console.log("key =" + key);
console.log("value =" + myMap[key]);
}
}
在javascript中,每个对象都有一堆内置的键值对,这些键值对有元信息。 当你循环浏览一个对象的所有键值对时,你也在循环浏览它们。 使用hasOwnProperty()可以过滤掉这些信息。
如果你使用[Lodash][1],你可以使用_.forEach
。
_.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
console.log(key + ": " + value);
});
// => Logs 'a: 1' then 'b: 2' (iteration order is not guaranteed).
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;