2017-06-29 65 views
0

我想过滤掉等于输入参数的arr中的元素。我想知道为什么这不起作用。为什么我不能使用循环过滤()出元素?

function destroyer(arr) { 
// Remove all the values 
var newarr = arr.slice(); 
var i = 1; 
while (i < arguments.length){ 
newarr = newarr.filter(function(num){ 
    if (num == arguments[i]){ 
    return (false); 
    } 
    return (true); 
    }); 
    i++; 
} 
return newarr; 
} 

驱逐舰([3,5,1,2,2],2,3,5);

应该返回[1];

我解决它使用拼接()代替方式:

function destroyer(arr) { 
    var i = 1; 
    while (i < arguments.length){ 
    var j = 0; 
    while (j < arr.length){ 
     if (arr[j] == arguments[i]){ 
     arr.splice(j,1); 
     j = j; 
     } 
     else 
     j++; 
    } 
    i++; 
    } 
    return arr; 
} 

回答

0

这个问题的根本原因是:在下面的代码:

newarr = newarr.filter(function(num){ 
    if (num == arguments[i]){ 
    return (false); 
    } 
    return (true); 
}); 

arguments是不是你所期望的。这里的arguments是指参数function(num){...,而不是参数destroyer(arr)

为了解决这个问题,你可以newarr.filter之前检索感兴趣号:

function destroyer(arr) { 
 
    // Remove all the values 
 
     var newarr = arr.slice(); 
 
     var i = 1; 
 
     while (i < arguments.length){ 
 
     var interested = arguments[i]; 
 
     newarr = newarr.filter(function(num){ 
 
      if (num == interested){ 
 
      return (false); 
 
      } 
 
      return (true); 
 
     }); 
 
     i++; 
 
     } 
 
     return newarr; 
 
    } 
 

 
    console.log(destroyer([3, 5, 1, 2, 2], 2, 3, 5));

+0

啊啊啊我看。这就说得通了。非常感谢。 – earthyearth

0

你可以简单的方式

function destroyer() { 
 
    let args = Array.from(arguments); // Create new array from the arguments 
 
     args.shift(); // remove first element from the arguments 
 
    return arguments[0].filter(item => !args.includes(item)); //Doing filter 
 
} 
 

 
console.log(destroyer([3, 5, 1, 2, 2], 2, 3, 5)); // [1]

0

做到这一点是有你一个具体的理由不使用Array.prototype.filter

例如:

const elements = [1, 2, 3, 4, 5, 6]; 
 

 
const filterInput = inputs => element => !inputs.includes(element); 
 

 
const filteredElements = elements.filter(filterInput([1, 5, 6])); 
 

 
console.log(filteredElements);

0

这是因为你在另一个函数中使用arguments变量,

if (num == arguments[i]){的参数变量,它是这里是第二个函数的actullay参数列表。

function(num){ 
    if (num == arguments[i]){ 
    return (false); 
    } 
    return (true); 
} 

来解决这个问题,试试这个:

function destroyer(arr) { 
    var i = 1, 
    args = arguments; 
    while (i < arguments.length){ 
    var j = 0; 
    while (j < arr.length){ 
     if (arr[j] == args[i]){ 
     arr.splice(j,1); 
     j = j; 
     } 
     else 
     j++; 
    } 
    i++; 
    } 
    return arr; 
} 
相关问题