我正在使用下面的代码段从数组中删除所有出现的值(在本例中为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;
答案 0 :(得分:5)
问题与兄弟97s有关 - 1, 32, 97, 97, 6
。按此顺序拼接前97时,下一个97会更改它的索引并进入第一个。但变量i
在该项目后跟踪。
删除项目时,请通过--i
降低索引。
您也可以通过filter
功能完成此操作。这将创建一个新数组,您只需要返回它。在这里,我使用input
数组创建并对象,并使用一个过滤input
并返回当前对象的函数。这将让你级联我认为从代码风格中漂亮的功能,并可以帮助你。
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;
答案 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
会继续增加。
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;
要获得更简单的解决方案,您可以通过传递filter
函数作为参数来使用callback
方法。
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;
答案 5 :(得分:1)
array.splice(array.indexOf(item), 1);
i--;
答案 6 :(得分:1)
问题是您在执行for-loop
时修改了元素&#39;索引也被修改。
更好的方法是使用.filter()
函数。
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;
请参阅?数组已过滤。
答案 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;