Javascript:通过包含方法来过滤数组

Fab*_*ian 2 javascript arrays built-in

通过将自定义函数传递给filter方法,可以在 Javascript 中过滤数组:

const bigArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const filteredArray = bigArray.filter(item => item < 5);
Run Code Online (Sandbox Code Playgroud)

也可以将函数作为“引用”传递:

function largerThanFive(item) {
  return item => item < 5;
}

const bigArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const filteredArray = bigArray.filter(largerThanFive);
Run Code Online (Sandbox Code Playgroud)

我尝试使用它通过以下方式将两个数组相交:

const bigArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const smallArray = [0, 1, 2];
const filteredArray = bigArray.filter(smallArray.includes);
Run Code Online (Sandbox Code Playgroud)

但我收到错误: TypeError: Cannot convert undefined or null to object

我不明白为什么。有人可以详细说明吗?

Nin*_*olz 8

通过使用原型函数,您将失去对 object 的引用smallArray。在这种情况下,您需要将对象与Function#bind,

const bigArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const smallArray = [0, 1, 2];
const filteredArray = bigArray.filter(Array.prototype.includes.bind(smallArray));

console.log(filteredArray);
Run Code Online (Sandbox Code Playgroud)

或使用thisArg参数Array#filter.

const bigArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const smallArray = [2, 1, 0];
const filteredArray = bigArray.filter(Array.prototype.includes, smallArray);

console.log(filteredArray); // 2 is missing
Run Code Online (Sandbox Code Playgroud)

但是上述两种方法都不起作用,因为Array#includes使用了第二个参数fromIndex,该参数是从调用函数传递过来的,index并省略了要检查的索引较小的值。

因此,您需要一个函数,该函数支持与方法提供的 api 相同的函数签名,或者比回调使用的函数签名更小。

例如,一种工作方法是使用SetasthisArgSet#hasas 回调。这种方法只使用了一个参数,非常适合。

const bigArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const smallArray = [2, 1, 0];
const filteredArray = bigArray.filter(Set.prototype.has, new Set(smallArray));

console.log(filteredArray);
Run Code Online (Sandbox Code Playgroud)