我在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

但是如何对对象进行处理呢?


当前回答

如果你想一次迭代整个对象,你可以使用for in循环:

for (var i in obj) {
  ...
}

但如果你想把物体分成几部分实际上你做不到。不能保证对象中的属性按任何指定的顺序排列。因此,我可以想到两种解决方案。

首先是“删除”已经读取的属性:

var i = 0;
for (var key in obj) {
    console.log(obj[key]);
    delete obj[key];
    if ( ++i > 300) break;
}

我能想到的另一个解决方案是使用数组的数组而不是对象:

var obj = [['key1', 'value1'], ['key2', 'value2']];

然后,标准for循环将工作。

其他回答

你可以尝试使用lodash-一个现代的JavaScript实用程序库,提供模块化,性能和额外的js来快速对象迭代

var  users  =   { 'fred':     {  'user':   'fred',     'age':  40  }, 'pebbles':  {  'user':   'pebbles',  'age':  1  } };  _.mapValues(users,  function(o)  {  return  o.age;  }); // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) // The `_.property` iteratee shorthand. console.log(_.mapValues(users,  'age')); // returns age property & value console.log(_.mapValues(users,  'user')); // returns user property & value console.log(_.mapValues(users)); // returns all objects // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash-compat/3.10.2/lodash.js"></script>

如果你想一次迭代整个对象,你可以使用for in循环:

for (var i in obj) {
  ...
}

但如果你想把物体分成几部分实际上你做不到。不能保证对象中的属性按任何指定的顺序排列。因此,我可以想到两种解决方案。

首先是“删除”已经读取的属性:

var i = 0;
for (var key in obj) {
    console.log(obj[key]);
    delete obj[key];
    if ( ++i > 300) break;
}

我能想到的另一个解决方案是使用数组的数组而不是对象:

var obj = [['key1', 'value1'], ['key2', 'value2']];

然后,标准for循环将工作。

对于迭代数组、字符串或对象的键,使用For ..:

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

然后你可以通过索引迭代你的属性:

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

我最终想出了一个方便的实用工具函数,具有统一的接口来迭代对象,字符串,数组,TypedArrays, Maps, Sets,(任何Iterables)。

const iterate = require('@a-z/iterate-it');
const obj = { a: 1, b: 2, c: 3 };

iterate(obj, (value, key) => console.log(key, value)); 
// a 1
// b 2
// c 3

https://github.com/alrik/iterate-javascript

在参数中定义object,避免选择器和下标

有许多语法选择,但这个在闭包的参数中定义了前面的对象,从而消除了迭代器中选择器或下标的需要。K是键,v是值,I是索引。

const obj = {
    kiwi: true,
    mango: false,
    pineapple: 500
};

Object.entries(obj).forEach(([k, v], i) => {
    console.log(k, v, i);
});

// kiwi true 0
// mango false 1
// pineapple 500 2