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

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


当前回答

有了新的ES6/ES2015特性,你不再需要使用对象来遍历散列。你可以使用地图。Javascript地图保持键的插入顺序,这意味着你可以迭代它们,而不必检查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"

其他回答

如果你有一个简单的对象,你可以使用下面的代码迭代它:

let myObj = { 美国广播公司(abc):“…” bca:“……” 鼾声大作:“……” xxx:“……” ccc:“……” / /…… }; let objKeys = Object.keys(myObj); //现在我们可以使用objKeys遍历myObj for (item of objKeys) { //这将打印密钥 console.log(关键:,项); //这将打印出值 console.log(价值:,myObj[项目]); }

如果你有一个嵌套对象,你可以使用下面的代码遍历它:

设b = { 一:{ 答:1, b: 2 c: 3 }, 二:{ 4, b: 5 c: 6 }, 三:{ 7, b: 8 c: 9 } }; let myKeys = Object.keys(b); for (item of myKeys) { //打印密钥 console.log(“关键”,项目) //打印值(这将是另一个对象) console.log(“价值”,b[项目]) //打印嵌套值 console.log('嵌套值',b[item]['a']) }

如果你有一个对象数组,你可以使用下面的代码遍历它:

令c = [ { 答:1, b: 2 }, { 答:3, b: 4 } ]; 对于(c项){ //单独打印整个对象 console.log(“对象”,项目); //打印对象内部的值 console.log(“价值”,项目[a]); }

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

实际上,PITA不是标准Javascript的一部分。

/**
 * Iterates the keys and values of an object.  Object.keys is used to extract the keys.
 * @param object The object to iterate
 * @param fn (value,key)=>{}
 */
function objectForEach(object, fn) {
    Object.keys(object).forEach(key => {
        fn(object[key],key, object)
    })
}

注意:我将回调参数切换为(value,key),并添加了第三个对象以使API与其他API保持一致。

像这样使用它

const o = {a:1, b:true};
objectForEach(o, (value, key, obj)=>{
    // do something
});

在参数中定义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

你可以尝试使用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>