如何迭代JavaScript对象?

nku*_*hta 361 javascript iteration loops object javascript-objects

我在JavaScript中有一个对象:

{
    abc: '...',
    bca: '...',
    zzz: '...',
    xxx: '...',
    ccc: '...',
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我想使用for循环来获取其属性.我想在部分中迭代它(不是一次所有的对象属性).

使用简单的数组我可以使用标准for循环:

for (i = 0; i < 100; i++) { ... } // first part
for (i = 100; i < 300; i++) { ... } // second
for (i = 300; i < arr.length; i++) { ... } // last
Run Code Online (Sandbox Code Playgroud)

但是如何用物体做呢?

Den*_*ret 736

对于大多数对象,请使用for .. in:

for (let key in yourobject) {
  console.log(key, yourobject[key]);
}
Run Code Online (Sandbox Code Playgroud)

使用ES6,如果您同时需要键和值,请执行

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

要避免记录继承的属性,请使用hasOwnProperty进行检查:

for (let key in yourobject) {
   if (yourobject.hasOwnProperty(key)) {
      console.log(key, yourobject[key]);
   }
}
Run Code Online (Sandbox Code Playgroud)

hasOwnProperty如果您使用的是简单对象(例如您自己制作的对象),则无需在迭代键时进行检查{}.

此MDN文档更一般地解释了如何处理对象及其属性.

如果你想"以块为单位",最好是提取数组中的键.由于订单无法保证,这是正确的方法.在现代浏览器中,您可以使用

let keys = Object.keys(yourobject);
Run Code Online (Sandbox Code Playgroud)

为了更兼容,你最好这样做:

 let keys = [];
 for (let key in yourobject) {      
     if (yourobject.hasOwnProperty(key)) keys.push(key);
 }
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过索引迭代您的属性yourobject[keys[i]]:

for (let i=300; i < keys.length && i < 600; i++) { 
   console.log(keys[i], yourobject[keys[i]]);
}
Run Code Online (Sandbox Code Playgroud)

  • OP希望以块的形式执行此操作,而不是单个循环中的所有键. (3认同)
  • @Cerbrus OP已经知道如何迭代部分数组.使用给定代码中的"keys"就足够了. (2认同)
  • @Cerbrus请在评论前阅读!什么不清楚*"为了更兼容,你最好这样做"*? (2认同)
  • @am05mhz 正如我所说,它对大多数对象都没用。但不是所有人。试试这个:http://jsbin.com/hirivubuta/1/edit?js,console,output (2认同)
  • 在 JS 开发了 9 年,我总是怀疑自己的“for..of”和“for..in”,最后来到了这里。 (2认同)
  • @choz:我记得使用哪种方法来使用助记符“Javascript iteration is **foreign**”,听起来像“for . .in”。我自己就该主题撰写了[一篇很长的文章](/sf/answers/4872295571/),但仍然需要助记符。 (2认同)

Vis*_*ioN 57

这是现代浏览器的另一种迭代解决方案:

Object.keys(obj).filter(function(k, i) {
    return i >= 100 && i < 300;
}).forEach(function(k) {
    console.log(obj[k]);
});
Run Code Online (Sandbox Code Playgroud)

甚至更短:

Object.keys(obj).forEach(function(k, i) {
    if (i >= 100 && i < 300) {
        console.log(obj[k]);
    }
});
Run Code Online (Sandbox Code Playgroud)

但是,您必须考虑JavaScript对象中的属性未排序,即没有顺序.


Ade*_*ran 16

Object.entries你做这样的事情.

 // array like object with random key ordering
 const anObj = { 100: 'a', 2: 'b', 7: 'c' };
 console.log(Object.entries(anObj)); // [ ['2', 'b'],['7', 'c'],['100', 'a'] ]
Run Code Online (Sandbox Code Playgroud)

Object.entries()方法返回给定对象自己的可枚举属性[key,value]的数组

所以你可以遍历Object并拥有keyvalue为每个对象获取这样的东西.

const anObj = { 100: 'a', 2: 'b', 7: 'c' };
Object.entries(anObj).map(obj => {
   const key   = obj[0];
   const value = obj[1];

   // do whatever you want with those values.
});
Run Code Online (Sandbox Code Playgroud)

或者像这样

// Or, using array extras
Object.entries(obj).forEach(([key, value]) => {
  console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
});
Run Code Online (Sandbox Code Playgroud)

有关参考,请查看对象条目的MDN文档


Pau*_*aul 15

使用新的ES6/ES2015功能,您不必再使用对象来迭代哈希.您可以使用地图.Javascript Maps将密钥保持在插入顺序中,这意味着您可以迭代它们而无需检查hasOwnProperty,这总是真的很糟糕.

迭代地图:

var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
for (var [key, value] of myMap) {
  console.log(key + " = " + value);
}
// Will show 2 logs; first with "0 = zero" and second with "1 = one"

for (var key of myMap.keys()) {
  console.log(key);
}
// Will show 2 logs; first with "0" and second with "1"

for (var value of myMap.values()) {
  console.log(value);
}
// Will show 2 logs; first with "zero" and second with "one"

for (var [key, value] of myMap.entries()) {
  console.log(key + " = " + value);
}
// Will show 2 logs; first with "0 = zero" and second with "1 = one"
Run Code Online (Sandbox Code Playgroud)

或使用forEach:

myMap.forEach(function(value, key) {
  console.log(key + " = " + value);
}, myMap)
// Will show 2 logs; first with "0 = zero" and second with "1 = one"
Run Code Online (Sandbox Code Playgroud)

  • forEach 是首选的 (2认同)

Der*_*ike 8

如果在迭代时需要键和值,则可以Object.entries使用for ... of循环。

const myObj = {a: 1, b: 2}

for (let [key, value] of Object.entries(myObj)) {
    console.log(`key=${key} value=${value}`)
}

// output: 
// key=a value=1
// key=b value=2
Run Code Online (Sandbox Code Playgroud)


Cer*_*rus 7

唯一可行的方法是将对象数据保存到2个数组,一个键和一个数据:

var keys = [];
var data = [];
for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        keys.push(key);
        data.push(obj[key]); // Not necessary, but cleaner, in my opinion. See the example below.
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以像通常那样迭代数组:

for(var i = 0; i < 100; i++){
    console.log(keys[i], data[i]);
    //or
    console.log(keys[i], obj[keys[i]]); // harder to read, I think.
}
for(var i = 100; i < 300; i++){
    console.log(keys[i], data[i]);
}
Run Code Online (Sandbox Code Playgroud)

我没有使用Object.keys(obj),因为那是IE 9+.


ash*_*hat 5

->如果我们使用并找到对象数组的键来遍历 JavaScript 对象

Object.keys(Array).forEach(key => {

 console.log('key',key)

})
Run Code Online (Sandbox Code Playgroud)