我有以下方法:
var items = [1,2,3];
$.map(items, function (item) {
if (item === 1) {
items.push(4);
}
console.log(item);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
我希望在控制台1,2,3,4中看到,但是请参阅1,2,3。我的意思是我想看到一个额外的循环项。
我能以某种方式解决它吗?如果是的话,我该如何解决?
答案 0 :(得分:2)
迭代器方法,例如.map()
或.forEach()
,将仅通过使用原始length
来阻止访问在迭代过程中添加的元素。
为避免这种情况,您将要使用标准循环,例如for..of
(default array iterator在检查length
的过程中对其进行检查):
var items = [1, 2, 3];
for (var item of items) {
if (item === 1) {
items.push(4);
}
console.log(item);
}
尽管如此,其他类型的循环也可以用来做同样的事情。
当然,除了当前示例之外,请注意,循环始终不会因从头到尾迭代新元素而变得无限。
答案 1 :(得分:1)
是的,您当然可以解决它,但是在特定情况下,items
会通过值传递给map
函数,这样您就不会意外更改原始变量。 map
的目的不是为了您正在使用的东西,而是用于通过特定键为对象或关联数组进行映射。您应该回到for循环或其他获取所需输出的方法。
var items = [1, 2, 3];
for (var i = 0; i < items.length; i++) {
const item = items[i];
if (item === 1) {
items.push(4);
}
console.log(item);
};
答案 2 :(得分:0)
使用 forIn 代替 forOf ,因为有时 forOf 会给出错误(也许 forOf 不支持旧版js)。
var items = [1,2,3];
var k;
for (k in items){
if(items[k] === 1){
items.push(4);
}
}
alert(items);