簡體   English   中英

過濾器功能不起作用的JavaScript比較

[英]Comparison on filter function not working javascript

我有一個可以使用兩個或多個參數的javascript函數。第一個參數始終是數字數組。 我需要從數組中刪除那些等於其他參數的數字,但是我的比較總是返回false

 function destroyer(arr) { var neo=[]; for(x=1;x<arguments.length;x++){ neo =arr.filter(function(a){ return a!=arguments[x] ; }); } return neo; } document.write( destroyer( [1, 2, 3, 1, 2, 3], 2, 3) ); 

這是結合使用過濾器和indexOf()方法的實現:

 function destroyer(arr) { var args = Array.prototype.slice.call(arguments, 1); return arr.filter(function(i) { return args.indexOf(i) < 0; }); } console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3)); // prints [1,1] 

關於為什么您的原始解決方案不起作用的原因有兩個:

  1. arguments反對你所訪問是arguments對象傳遞到過濾器回調函數,而不是一個傳遞給你的destroyer功能。
  2. 每次迭代時,您都要將neo[]數組重新初始化為僅過濾出最后一個比較值的數組。

有關您的方法的更正,請參見Sebi的解決方案

arguments的匿名函數看到的是不一樣的argumentsdestroyer功能。 由於arr.filter調用您的回調函數,因此它將獲得新的參數。

以下內容按原樣修復了代碼,有關其他方法,請參閱Robby的答案。

function destroyer(arr) {
    var args = arguments;
    return arr.filter(function(a) {
        for(var x = 1; x < args.length; x++) {
            if(args[x] == a) {
                return false;
            }
        }
        return true;
    });
}

它將外部函數的參數分配給args變量,從而使它們可以從匿名函數訪問。

代碼中有兩個錯誤,正確的是:

 function destroyer(arr) { var arg = arguments; for(x=1;x<arguments.length;x++){ arr =arr.filter(function(a){ return a!=arg[x] ; //arguments change here }); } return arr; } 

(1) arguments已在第二個函數中更改。 您需要將先前的arguments保存在閉包中。

(2)變量neo將在第二個循環中保持不變,因為arr保持不變。 因為arr用作隊列,所以如果您不想更改arr,則可以通過arr.concat()這樣的克隆進行傳遞

我想保留的是,這是在瀏覽器的調試模式下查找錯誤的好方法。 當使用斷點執行該過程時,您會發現在第二個arguments處出現了arguments

您的代碼之所以無法正常運行,部分原因是您試圖在回調函數(a){}中與destroyer的arguments [x]進行比較,后者具有自己的arguments [x]。

Javascript正在將數組元素與function(a){}的參數進行比較。

 function destroyer(arr) { var neo=[]; for(x=1;x<arguments.length;x++){ neo =arr.filter(function(a){ return a!=arguments[x] ; }); } return neo; } document.write( destroyer( [1, 2, 3, 1, 2, 3], 2, 3) ); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM