【问题标题】:Issue with Javascript For loopJavascript For循环的问题
【发布时间】:2012-09-20 02:58:00
【问题描述】:

考虑下面的代码:

function splicer()
{
 var arrayElements = ["elem1","elem2","elem3","elem4"];
 for(var index in arrayElements)
 {
  arrayElements.splice(index,1);
 }
 alert("Elements: "+arrayElements);
}

上述函数应该从数组"arrayElements" 中删除所有元素。但它不会。

Javascript 引擎按原样维护"index",并且不介意修改数组。 人们可能会期望像"for each" 这样的循环不会出现此类问题

即使下面的代码似乎也不起作用:

function splicer()
{
...
 for(var index in arrayElements)
 {
  arrayElements.splice(index--,1);
 }
...
}

即使更改变量“index”的值似乎也不起作用。 更改后的值在“for(...){...}”块中可用,但是,当循环到达下一次迭代时,该值将被重置并从下一个索引继续作为发条。

所以看起来像这样的代码可能是唯一的解决方案:

function splicer()
{
 var arrayElements = ["elem1","elem2","elem3","elem4"];
 for(var index=0;index<arrayElements.length;index++)
 {
  arrayElements.splice(index--,1);
 }
 alert("Elements: "+arrayElements);
}

测试于:Firefox 16 Beta。

但在 "splice()" 方法中放置一元运算符乍一看似乎会产生误导。

这可能值得 "W3C" 或任何可能关心的人考虑,以便他们提出一个不错的解决方案。

【问题讨论】:

标签: javascript arrays for-loop foreach


【解决方案1】:

您可能需要参考 John Resig 的 array.remove()link

// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.push.apply(this, rest);
};

【讨论】:

  • D 这段代码看起来不错。但是修改“开箱即用”的数组对象听起来不是一个好主意。顺便说一句,代码 sn-p 乍一看并不友好。编写此代码的人可能已经仔细完成了此操作,他一定非常擅长...
  • @CrystalPaladin 该链接为您提供了未使用原型的示例。
【解决方案2】:

试试这个:

*Splice 会修改原始数组,因此 tge 循环会跳过备用值。 *

var arrayElements = ["elem1","elem2","elem3","elem4"];
arrayElements.splice(0,arrayElements.length);
alert("Elements: "+arrayElements)

【讨论】:

  • 不是替代值,它只是逐步跳过。第一次迭代跳过一个,第二次跳过两个,不包括它已经跳过的第一个。等等……
  • 我不是在强调清空数组!我预计观众可能会想到这种情况下 JavaScript 行为的可能解决方案/解释
  • 如果你看到 splice 文档 - w3schools.com/jsref/jsref_splice.asp,上面写着 This method changes the original array. 让我为你创建一个小提琴,希望能让事情变得清晰。过段时间我会发的。
猜你喜欢
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
相关资源
最近更新 更多