我想出了这个,似乎有效:
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这样的东西,但这不起作用。
答案 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.keys
和forEach
您只需拨打一次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循环遍历数组。