通过此数组js将项目添加到数组中

时间:2018-08-31 05:49:00

标签: javascript jquery

我有以下方法:

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。我的意思是我想看到一个额外的循环项。

我能以某种方式解决它吗?如果是的话,我该如何解决?

3 个答案:

答案 0 :(得分:2)

迭代器方法,例如.map().forEach(),将仅通过使用原始length来阻止访问在迭代过程中添加的元素。

为避免这种情况,您将要使用标准循环,例如for..ofdefault 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);