2016-03-22 47 views
2

所以,我對於獲得兩個數組的交叉驗證碼:裹濾鏡陣列VS綁定功能

var a = [1,2,3]; 
var b = [2,3,4]; 
var intersection = a.filter(x => b.includes(x)); 

,我得到[2,3]這是正確的。但後來我想,爲什麼不這樣做:

var binc = b.includes.bind(b); 
var intersection = a.filter(binc); 

和我得到[]。爲什麼?這工作:a.filter(x => binc(x))bincx => binc(x)返回每個輸入相同的值。那麼,過濾器做了什麼,我在這裏失蹤?

回答

1

In the documentation,你可以看到Array#includes有兩個參數:

  1. searchElement
  2. fromIndex(在陣列中的位置,從其中搜索)

因爲你叫binc的方式,它會得到所有的參數Array#filter回調得到:

  1. value(填充searchElement
  2. index(填充fromIndex,讓您的includes搜索失敗)
  3. completearray

因此,您需要將回調傳遞給Array#filter,該回調只通過所需的val UE進入Array#includes,使得fromIndex沒有填充:

var a = [1,2,3]; 
var b = [2,3,4]; 
var binc = b.includes.bind(b); 
var intersection = a.filter(x => binc(x)); 
+0

啊那些該死的額外的參數。謝謝。正在讓我發瘋。 – Tetaxa

1

filter將三個參數傳遞給回調函數:elementindexarray
includes接受兩個參數:searchElementfromIndex

你可以揣摩自己如何在兩個帶有附加參數,以產生不同的結果,互動......

0

的問題是,所述includes(element, fromIndex)方法需要時調用filter(value, index, currArray)不必要第二個參數fromIndex。這打破了includes()方法的執行。

爲了讓你的代碼工作(只是爲了研究,不用於生產),這種方法可用於:

var oldIncludes = Array.prototype.includes; 
Array.prototype.includes = function(element) { 
    //use only the first argument: the element 
    return oldIncludes.call(this, element); 
}; 

var a = [1,2,3]; 
var b = [2,3,4]; 

var binc = b.includes.bind(b); 
var intersection = a.filter(binc); 

console.log(interesection); //prints "[2, 3]" 
+1

擴展原生原型可能會破壞其他代碼,特別是如果您包含依賴於正常運行的「Array#includes」的第三方代碼。不要這樣做,除非你真的*知道你在做什麼。 – nils

+0

@nils此代碼僅用於研究。請參閱答案中的提及。 –