JavaScript中的..In循环-键值对

我想知道是否有一种方法可以在JavaScript中做一些类似PHP foreach循环的事情。我正在寻找的功能是类似这样的PHP代码片段:

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

我正在看JS for..in循环,但似乎没有办法指定as。如果我这样做与一个'正常'循环(for(var i = 0; i < data.length; i++),有一种方法来抓取键=>值对?

876372 次浏览
var obj = {...};
for (var key in obj) {
var value = obj[key];


}

php语法简直就是糖。

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不是一个方法(如果targetarray,你会得到很多方法的警告,例如indexOfpushpop等)。

对…将为您工作。

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

在现代JavaScript中,你也可以这样做:

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


}

我假设您知道i是键,并且可以通过data[i]获得该值(并且只是想为此提供一个快捷方式)。

ECMAScript5为数组引入了# EYZ0 < em > <一口> [MDN] < /一口> < / em >(看起来你有一个数组):

data.forEach(function(value, index) {


});

MDN文档为不支持它的浏览器提供了一个缓冲。

当然,这并不适用于对象,但你可以为它们创建一个类似的函数:

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

因为你用标记了问题,jQuery提供了# EYZ0 < em > <一口>[医生]< /一口> < / em >,它在数组和对象结构上循环。

你可以使用for..in

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

你可以使用'for in'循环来实现:

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

是的,在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 ...
}

下面是一个非常接近的例子。

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

如果你使用的是jQuery,请参考:http://api.jquery.com/jQuery.each/

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;

没有人提到Object.keys,所以我就提一下。

Object.keys(obj).forEach(function (key) {
// do something with obj[key]
});
for (var key in myMap) {
if (myMap.hasOwnProperty(key)) {
console.log("key =" + key);
console.log("value =" + myMap[key]);
}
}

在javascript中,每个对象都有一堆内置的键值对,其中包含元信息。当你循环遍历一个对象的所有键值对时,你也是在循环遍历它们。使用hasOwnProperty()可以过滤掉这些。

ES6将提供Map.prototype.forEach(回调),可以像这样使用

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

如果你可以使用ES6本机或巴别塔 (js编译器),那么你可以做以下事情:

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循环也枚举原型链中的属性)所提供的顺序相同。

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


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

如果您使用Lodash,则可以使用_.forEach

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

在提出这个问题后的过去几年中,Javascript添加了一些新特性。其中之一是对象。条目方法。

下面是直接从MDN复制的代码片段


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


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

有三个选项来处理对象的键和值:

  1. < p >选择值:

    Object.values(obj).forEach(value => ...);
    
  2. < p >选择键:

    Object.keys(obj).forEach(key => ...);
    
  3. 选择键值:

    Object.entries(obj).forEach(([key, value]) => ...);
    

为什么不简单地说

var donuts = [
{ type: "Jelly", cost: 1.22 },
{ type: "Chocolate", cost: 2.45 },
{ type: "Cider", cost: 1.59 },
{ type: "Boston Cream", cost: 5.99 }];


donuts.forEach(v => {console.log(v["type"]+ " donuts cost $"+v["cost"]+" each")});

请尝试以下代码:

<script>
const games = {
"Fifa": "232",
"Minecraft": "476",
"Call of Duty": "182"
};


Object.keys(games).forEach((item, index, array) => {
var msg = item+' '+games[item];
console.log(msg);
});