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
我不明白为什么。有人可以详细说明吗?
通过使用原型函数,您将失去对 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 missingRun Code Online (Sandbox Code Playgroud)
但是上述两种方法都不起作用,因为Array#includes使用了第二个参数fromIndex,该参数是从调用函数传递过来的,index并省略了要检查的索引较小的值。
因此,您需要一个函数,该函数支持与方法提供的 api 相同的函数签名,或者比回调使用的函数签名更小。
例如,一种工作方法是使用SetasthisArg和Set#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)