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

cab*_*ret 380 javascript foreach

我想知道是否有办法foreach在JavaScript中执行类似PHP 循环的操作.我正在寻找的功能就像这个PHP代码片段:

foreach($data as $key => $value) { }
Run Code Online (Sandbox Code Playgroud)

我在看JS for..in循环,但似乎没有办法指定as.如果我使用'normal'for loop(for(var i = 0; i < data.length; i++)执行此操作,是否有办法获取key => value对?

J0H*_*0HN 509

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

hasOwnProperty用于检查您是否target真的具有该属性,而不是从其原型继承它.更简单的是:

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

它仅仅检查k是不是方法(好像targetarray,你会得到很多的提醒方法,例如indexOf,push,pop等.)

  • 另一种只对"自己"属性进行迭代的方法是`Object.keys`.`Object.keys(target).forEach(function(key){target [key];});`. (86认同)
  • 如果`target`是使用`Object.create(null)`创建的,则无法工作,代码应该更改`target.hasOwnProperty(k)` - >`Object.prototype.hasOwnProperty.call(target,k)` (2认同)
  • Object.keys(target).forEach((key) =&gt; { target[key]; }); 对于角 (2认同)

goa*_*ker 305

没有人提到过,Object.keys所以我会提到它.

Object.keys(obj).forEach(function (key) {
   // do something with obj[key]
});
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,"除了通过抛出异常之外,没有办法停止或破坏forEach()循环" (16认同)
  • 注意:IE8和更低版本不支持。 (2认同)
  • 此时您应该使用 ES5 垫片。如果你生活在美好的 ES6 未来,请使用 `for of` http://tc39wiki.calculist.org/es6/for-of/ (2认同)

Fra*_*ula 160

如果您可以本机使用ES6或使用Babel(js编译器),那么您可以执行以下操作:

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

for (const [key, value] of Object.entries(test)) {
  console.log(key, value);
}
Run Code Online (Sandbox Code Playgroud)

哪个会打印出这个输出:

a 1
b 2
c 3
Run Code Online (Sandbox Code Playgroud)

Object.entries()方法返回给定对象自己的可枚举属性[key, value]对的数组,其顺序与for...in循环提供的顺序相同(不同之处在于for-in循环也枚举了原型链中的属性).

希望能帮助到你!=)

  • 这是对手头问题的最佳答案,该问题涉及抓取for循环中的键和值. (4认同)
  • 接受的答案应该更新,因为这实际上回答了问题,尽管在问题发生时没有. (3认同)
  • 在这种特定情况下,我认为由于“Object.entries”调用而速度较慢。不过我没有进行任何测试。 (2认同)
  • 您可能想检查这个问题:/sf/ask/3304955601/ Between-two-no-restricted-syntax-violations 这似乎表明建议使用这种类型的语法:Object.keys (myObject).forEach(key =&gt; {... (2认同)

Pau*_*aul 103

__CODE__将适合你.如果您将对象视为地图:

for( var key in obj ) {
  var value = obj[key];
}
Run Code Online (Sandbox Code Playgroud)


Zir*_*rak 61

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

}
Run Code Online (Sandbox Code Playgroud)

php语法只是糖.


Fel*_*ing 23

我假设你知道这i是关键,你可以通过data[i](并且只想要一个快捷方式)获得价值.

ECMAScript5 为数组引入了forEach [MDN](看起来你有一个数组):

data.forEach(function(value, index) {

});
Run Code Online (Sandbox Code Playgroud)

MDN文档为不支持它的浏览器提供了一个垫片.

当然这不适用于对象,但您可以为它们创建类似的功能:

function forEach(object, callback) {
    for(var prop in object) {
        if(object.hasOwnProperty(prop)) {
            callback(prop, object[prop]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

由于您使用标记了问题,因此jQuery提供了$.each [docs]循环,数组和对象结构.

  • 所以?显然,OP 正在遍历一个数组。 (2认同)
  • @katspaugh:是的,但因为它只是 Mozilla,所以它似乎不是很有用。 (2认同)

Ton*_*tio 12

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

  1. 选择值:

    Object.values(obj).forEach(value => ...);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 选择键:

    Object.keys(obj).forEach(key => ...);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 选择键和值:

    Object.entries(obj).forEach(([key, value]) => ...);
    
    Run Code Online (Sandbox Code Playgroud)


Chr*_*ler 8

你可以使用for..in它.

for (var key in data)
{
    var value = data[key];
}
Run Code Online (Sandbox Code Playgroud)


Sid*_*dhu 8

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

在javascript中,每个对象都有一堆具有元信息的内置键值对.循环遍历对象的所有键值对时,也会循环遍历它们.使用hasOwnProperty()过滤掉这些.


吴毅凡*_*吴毅凡 5

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

// a 1
// b 2
// c 3
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用您发布的代码添加一些解释,而不是发布可能无法理解的普通代码。 (6认同)

Dav*_*vid 5

自从提出这个问题以来,Javascript 添加了一些新功能。其中之一是Object.Entries方法。

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


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

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