2017-06-29 63 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; 
} 
相關問題