我在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循环。该结构将循环遍历所有可枚举属性,包括通过原型继承继承的属性。例如:

让obj = { prop1:(1), prop2: ' } 对于(let the in obj) { console.log (el); console.log (obj [ol]); }

然而,for. in将遍历所有可枚举元素,这将不能将迭代分割成块。为此,我们可以使用内置的object .keys()函数来检索数组中对象的所有键。然后,我们可以将迭代分解为多个for循环,并使用keys数组访问属性。例如:

让obj = { prop1: ' 1 ', prop2: ' 2 ', prop3:“3”, prop4:“4”, }; const keys = Object.keys(obj); console.log(键); 对于(设I = 0;I < 2;我+ +){ console.log (obj[键[我]]); } For(令I = 2;I < 4;我+ +){ console.log (obj[键[我]]); }

其他回答

使用对象。你这样做。

 // 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]的数组。

你可以遍历对象每个对象都有键和值,得到这样的东西。

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文档中的对象条目

对于迭代数组、字符串或对象的键,使用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]]);
}

下面是另一个针对现代浏览器的迭代解决方案:

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对象中的属性是没有排序的,也就是说没有顺序。

唯一可靠的方法是将对象数据保存到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.
    }
}

然后你可以迭代数组,就像你通常会:

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

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

如果你想一次迭代整个对象,你可以使用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循环将工作。