javascript是否有办法在没有for循环的情况下循环访问对象?

时间:2015-09-22 12:25:50

标签: javascript

我想出了这个,似乎有效:

  var errors = [];
     for (var key in response.data.modelState) {
         for (var i = 0; i < response.data.modelState[key].length; i++) {
             errors.push(response.data.modelState[key][i]);
         }
     }

然而,现代浏览器中有一种方法可以在不设置var i = 0的循环的情况下完成吗?我希望像foreach这样的东西,但这不起作用。

3 个答案:

答案 0 :(得分:3)

ES5的.forEach()正是您所寻找的:

var errors = [];
for (var key in response.data.modelState) {
    response.data.modelState[key].forEach(function (modelStateValue) {
        errors.push(modelStateValue);
    });
}

forEach在IE9 + http://caniuse.com/#search=forEach

中实现

response.data.modelState[key]必须是Array

类型的对象

答案 1 :(得分:3)

该代码中有两个循环。

  • 您可以使用Object.keysforEach

  • 替换外部循环
  • 您只需拨打一次errors.push

  • 即可替换内部循环

像这样:

var errors = [];
Object.keys(response.data.modelState).forEach(function(key) {
    errors.push.apply(errors, response.data.modelState[key]);
});

循环遍历response.data.modelState上的“自己的”可枚举属性名称,然后将每个条目的所有值推送到errors(使用一种技巧,可以从数组中推送所有条目到另一个数组:.push.apply(target, source))。

在ES6中,你可以使用扩展运算符作为第二部分:

let errors = [];
Object.keys(response.data.modelState).forEach(key => {
    errors.push(...response.data.modelState[key]);
});

答案 2 :(得分:0)

Jquery有一个.each()函数。

Javascript还为数组提供forEach(),今天绝大多数现代浏览器都支持这种方式(IE8及更低版本不支持它)。还有for-in循环,但这应该避免,因为它意味着枚举对象属性,而不是迭代。

值得一提的是.forEach()是significantly slower而不是使用常规for循环遍历数组。