Javascript: 通过include方法过滤数组

Javascript: Pass include method to filter array

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

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

也可以将函数作为 "reference":

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

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

我试图通过以下方式使用它来交叉两个数组:

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

但是我得到了错误: TypeError: Cannot convert undefined or null to 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);

或使用Array#filterthisArg参数。

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

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

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

例如,一种可行的方法是使用 Set as thisArg along with Set#has 作为回调。该方法只用一个参数,非常适合

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);

错误 TypeError: Cannot convert undefined or null to object 是由于您调用一个需要 Object 作为其参数的函数,但却传递了 undefined 或 null 而引起的

您可以获取过滤器中的每个项目,然后您可以检查 smallArray 是否有该项目,例如,

smallArray.includes(item);

片段如下:

const bigArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const smallArray = [0, 1, 2];
const filteredArray = bigArray.filter(item => {
  return smallArray.includes(item);
});

console.log(filteredArray);