[英]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]
關於為什么您的原始解決方案不起作用的原因有兩個:
arguments
反對你所訪問是arguments
對象傳遞到過濾器回調函數,而不是一個傳遞給你的destroyer
功能。 neo[]
數組重新初始化為僅過濾出最后一個比較值的數組。 有關您的方法的更正,請參見Sebi的解決方案 。
該arguments
的匿名函數看到的是不一樣的arguments
從destroyer
功能。 由於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.