JavaScript从数组中删除所有出现的值

时间:2018-02-04 12:36:37

标签: javascript arrays

我正在使用下面的代码段从数组中删除所有出现的值(在本例中为97)。我无法理解为什么输出数组的值为97。当我删除32时,它从阵列中删除所有32。与此相同6. 97这里有什么问题?对我来说有点奇怪。 (我当时想的可能是97没有正确输入或者其他东西)。



var inputArr = [3, 97, 32, 6, 97, 2, 9,32, 1, 32, 97, 97, 6, -1, 5];

function removeItem(array, item) {
  for(i = 0; i<array.length; i++){
    if(array[i] == item) {
      array.splice(array.indexOf(item), 1);
    }
  }
}
removeItem(inputArr, 97); removeItem(inputArr, 32); removeItem(inputArr, 6);

document.getElementById("output").innerHTML = inputArr;
&#13;
<p id="output"></p>
&#13;
&#13;
&#13;

9 个答案:

答案 0 :(得分:5)

问题与兄弟97s有关 - 1, 32, 97, 97, 6。按此顺序拼接前97时,下一个97会更改它的索引并进入第一个。但变量i在该项目后跟踪。

删除项目时,请通过--i降低索引。

您也可以通过filter功能完成此操作。这将创建一个新数组,您只需要返回它。在这里,我使用input数组创建并对象,并使用一个过滤input并返回当前对象的函数。这将让你级联我认为从代码风格中漂亮的功能,并可以帮助你。

&#13;
&#13;
const obj = {
   input: [3, 97, 32, 6, 97, 2, 9,32, 1, 32, 97, 97, 6, -1, 5],
   removeItem(item) {
      this.input = this.input.filter(i => i !== item);
      return this;
   }
}

const output = obj.removeItem(97)
                  .removeItem(32)
                  .removeItem(6); 
      
console.log(output.input);
&#13;
&#13;
&#13;

答案 1 :(得分:3)

当您改变数组并在拼接时增加索引时,您可以采用另一种方法并从数组的末尾开始。这意味着以下项目仍可在其原始索引处使用,并且可以在必要时进行检查和拼接,而不会留下一些未拼写的值。

function removeItem(array, item) {
    var i = array.length;

    while (i--) {
        if (array[i] === item) {
            array.splice(array.indexOf(item), 1);
        }
    }
}

var inputArr = [3, 97, 32, 6, 97, 2, 9, 32, 1, 32, 97, 97, 6, -1, 5];

removeItem(inputArr, 97);
removeItem(inputArr, 32);
removeItem(inputArr, 6);

console.log(inputArr);

答案 2 :(得分:2)

使用过滤器

const newArray = inputArr.filter(element => ![97, 32, 6].includes(element));

filter所做的是它创建了一个新的array。要确定新array中的内容,它需要遍历旧数组中的每个element,如果我们为当前true返回element,那么它已添加到新array

element => ![97, 32, 6].includes(element)表示我们询问array [97, 32, 6]是否具有当前element的值。由于我们不想将其添加到列表中,因此我们在行前写!,因为我们希望发生相反的情况。

答案 3 :(得分:2)

  

有点棘手

所以当你得到一个匹配时,你做splice(),因此(i + 1)元素来到i。但是下一次迭代从i + 1开始,所以它与第i个元素(i +第1个元素)不匹配。

这里最后两个97是连续的,因此只匹配了一个。

试试这个 -

function removeItem(array, item) {
    for(i = 0; i<array.length; i++){
        if(array[i] == item) {
            array.splice(array.indexOf(item), 1);
            i--;
        }
    }
}

答案 4 :(得分:1)

删除一个元素时,您还必须减少i的值。

  

为什么会这样?

因为splice方法更改了数组的内容,并且元素的索引也发生了更改。因此,当您需要从数组中remove个连续97元素时,您必须减少i的值。

当您从数组中删除第一个97元素时,下一个97元素会更改它的索引,但i会继续增加。

&#13;
&#13;
var inputArr = [3, 97, 32, 6, 97, 2, 9,32, 1, 32, 97, 97, 6, -1, 5];

function removeItem(array, item) {
	for(i = 0; i<array.length; i++){
		if(array[i] == item) {
			array.splice(array.indexOf(item), 1);
                        i--;
		}
    }
}
removeItem(inputArr, 97); 
removeItem(inputArr, 32); 
removeItem(inputArr, 6);
document.getElementById("output").innerHTML = inputArr;
&#13;
<p id="output"></p>
&#13;
&#13;
&#13;

要获得更简单的解决方案,您可以通过传递filter函数作为参数来使用callback方法。

&#13;
&#13;
var inputArr = [3, 97, 32, 6, 97, 2, 9,32, 1, 32, 97, 97, 6, -1, 5];

function removeItem(array, item) {
    return array.filter(i => i !== item);
}
inputArr = removeItem(inputArr, 97); 
inputArr = removeItem(inputArr, 32);
inputArr = removeItem(inputArr, 6);

console.log(inputArr);
&#13;
&#13;
&#13;

答案 5 :(得分:1)

拼接之后,你必须用1减少我。

array.splice(array.indexOf(item), 1);
i--;

答案 6 :(得分:1)

问题是您在执行for-loop时修改了元素&#39;索引也被修改。

更好的方法是使用.filter()函数。

请查看此代码段

&#13;
&#13;
var inputArr = [3, 97, 32, 6, 97, 2, 9, 32, 1, 32, 97, 97, 6, -1, 5];

function removeItem(array, item) { 
  return array.filter((i) => i !== item);
}

inputArr = removeItem(inputArr, 97);
inputArr = removeItem(inputArr, 32);
inputArr = removeItem(inputArr, 6);

document.getElementById("output").innerHTML = inputArr;
&#13;
<p id="output"></p>
&#13;
&#13;
&#13;

请参阅?数组已过滤。

资源

答案 7 :(得分:0)

这是一个 ES5 版本,运行速度更快,尤其是在数组稀疏的情况下

function removeAll( array, item ) {
    for (var i = 0; (i = array.indexOf(item, i)) >= 0; array.splice(i, 1));
}
var inputArr = [3, 97, 32, 6, 97, 2, 9, 32, 1, 32, 97, 97, 6, -1, 5];

removeAll(inputArr, 97);
removeAll(inputArr, 32);
removeAll(inputArr, 6);

console.log(inputArr);

答案 8 :(得分:0)

你应该像这样添加 i--

var inputArr = [3, 97, 32, 6, 97, 2, 9, 32, 1, 32, 97, 97, 6, -1, 5];

function removeItem(array, item) {
    for (i = 0; i < array.length; i++) {
        if (array[i] == item) {
            array.splice(array.indexOf(item), 1);
            i--;
        }
    }
}
removeItem(inputArr, 97);
removeItem(inputArr, 32);
removeItem(inputArr, 6);

document.getElementById('output').innerHTML = inputArr;