如何遍历 JavaScript 对象?

IT技术 javascript loops object iteration javascript-objects
2021-02-04 05:05:02

我在 JavaScript 中有一个对象:

{
    abc: '...',
    bca: '...',
    zzz: '...',
    xxx: '...',
    ccc: '...',
    // ...
}

我想使用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

但是如何处理对象呢?

6个回答

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

for (let key in yourobject) {
  console.log(key, yourobject[key]);
}

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

for (let [key, value] of Object.entries(yourobject)) {
    console.log(key, value);
}

为避免记录继承的属性,请检查hasOwnProperty

for (let key in yourobject) {
   if (yourobject.hasOwnProperty(key)) {
      console.log(key, yourobject[key]);
   }
}

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

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

如果您想“分块”进行,最好的方法是提取数组中的键。由于不能保证顺序,这是正确的方法。在现代浏览器中,您可以使用

let keys = Object.keys(yourobject);

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

 let keys = [];
 for (let key in yourobject) {      
     if (yourobject.hasOwnProperty(key)) keys.push(key);
 }

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

for (let i=300; i < keys.length && i < 600; i++) { 
   console.log(keys[i], yourobject[keys[i]]);
}
OP 希望分块执行此操作,而不是单个循环中的所有键。
2021-03-23 05:05:02
在JS用9年时间,我总是怀疑自己有for..offor..in,并最终来到这里。
2021-03-24 05:05:02
@Cerbrus 请在评论前阅读!什么是不以明文“更兼容的,你最好这样做”
2021-04-01 05:05:02
@Cerbrus OP 已经知道如何分部分迭代数组。keys从给定的代码中使用应该就足够了。
2021-04-05 05:05:02
@am05mhz 正如我所说,它对大多数对象都没用。但不是所有人。试试这个:jsbin.com/hirivubuta/1/edit?js,console,output
2021-04-05 05:05:02

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

Object.keys(obj)
  .filter((k, i) => i >= 100 && i < 300)
  .forEach(k => console.log(obj[k]));

或者没有过滤功能:

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

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

如果我打破循环,下次它会从对象的开头开始,这不是正确的方法。
2021-03-20 05:05:02

使用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'] ]

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.
});

或者像这样

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

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

使用新的 ES6/ES2015 特性,您不必再使用对象来迭代哈希。您可以使用MapJavascript 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"

或使用 forEach:

myMap.forEach(function(value, key) {
  console.log(key + " = " + value);
}, myMap)
// Will show 2 logs; first with "0 = zero" and second with "1 = one"
forEach 是首选的
2021-04-02 05:05:02

如果您在迭代时需要键和值,您可以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