javascript - Unshift 连续循环?

标签 javascript

我正在尝试将一个循环中的项目添加到我的“storedCompletion”数组的开头,但由于某种原因它只是继续循环并使浏览器崩溃。

我不明白为什么,因为在遍历数组中的每个对象后,它会检查对象 ID 是否与列表项元素 ID 匹配,所以它应该只运行一次?

JS

  if(localStorage) {
    var storedCompletion = JSON.parse(localStorage.getItem('todos'));
  }

  for(var f=0; f<storedCompletion.length; f++) {
    if(storedCompletion[f].id == listItem.id) {
      storedCompletion[f].completed = false;
      console.log(storedCompletion);
      storedCompletion.unshift(storedCompletion[f]);
      console.log(storedCompletion);
    }
  }
  localStorage.setItem('todos', JSON.stringify(storedCompletion));

最佳答案

你正在循环 f < storedCompletion.length ,但您正在增加 for 循环内的长度。

因为你是unshift() -ing,项目转到开头。这意味着一切都会被推到一个之上。所以,当f++碰巧,它看的是同一个项目。因此,它将永远添加。

通过它几次:

s = [0]; // s.length === 1, f < s.length
f = 0;
// unshift s, f++
s = [1,0]; // s.length === 2, f < s.length
f = 1; // still points at 0
// unshift s, f++
s = [2,1,0]; // s.length === 3, f < s.length
f = 2; // still points at 0

以此类推。你进入了一个无限循环。

我不确定你到底想做什么,但你可能想要做的是创建一个新数组来添加新项目,然后离开 storedCompletion单独,然后将新数组设置为 storedCompletion .

关于javascript - Unshift 连续循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45042511/

相关文章:

javascript - ES6 集合、WeakSet、Map 和 WeakMap

javascript - 用大小不等的圆圈填充空间

javascript - 从查询中的查询访问 MongoDB 值

javascript - geocoder.geocode 异步调用可以同步吗?我的代码可以进行哪些更改?

javascript - 按下某个键时忽略延迟?

javascript - 如何检测 Chrome Inspect Element 是否正在运行?

javascript - 多表单验证: where to put $ajax when valid?

javascript - 动态显示下拉框中的值,然后显示用户选择的已存储在数据库中的值

javascript - Jquery Selectable 无需保持控制

javascript - 使用 vue.js 在每个页面上更改 laravel 变量