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#filter
的thisArg
参数。
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);
通过将自定义函数传递给 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#filter
的thisArg
参数。
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);