for (let i = 0; i < arr.length; i++) {
if (arr[i] % 2 == 0) {
filteredArr.push(arr[i]);
}
}
return filteredArr;
}
console.log(filterEven(arr));
// Output:
// [ 2, 4, 6, 8, 10 ]
同样,正如预期的那样,我们将得到一个包含所有偶数的数组的所需输出 - `[ 2, 4, 6, 8, 10 ]`。
但是请注意,我们在这种方法中编写了很多重复的代码。以上两个函数都做了很多共同的事情,比如接受原始数组,创建一个新数组来存储过滤后的数组,循环整个主数组,最后返回过滤后的数组。
这两个函数之间的唯一区别是它们用于过滤掉原始数组的逻辑。
对于函数`filterOdd`,我们使用逻辑,`arr[i] % 2 !== 0`而在`filterEven`函数中,我们使用逻辑`arr[i] % 2 == 0`过滤掉原始数组。
这是我们可以从使用高阶函数中受益的地方。主要目的是创建一个函数来完成我们在上述两个函数中所做的所有常见事情,并将逻辑部分作为参数单独传递给该函数。让我们看看如何实现这一点。
让我们创建一个函数来完成我们在`filterOdd`and`filterEven`函数中执行的所有常见操作。这将是这样的:
function filterFunction(arr, callback) {
const filteredArr = [];
for (let i = 0; i < arr.length; i++) {
callback(arr[i]) ? filteredArr.push(arr[i]) : null;
}
return filteredArr;
}
暂时忽略这个`callback`参数。请注意,在 new 中`filterFuntion`我们如何保留所有常见步骤,即接受原始数组,创建一个新数组来存储过滤后的数组,循环整个主数组,最后返回我们在`filterOdd`and`filterEven`函数中执行的过滤后的数组.
现在`callback`参数基本上接受了逻辑,它只不过是另一个包含过滤逻辑的函数。为了分别过滤奇数和偶数,下面是我们需要编写的逻辑函数:
// Function containing logic for filtering out odd numbers
function isOdd(x) {
return x % 2 != 0;
}
// Function containing logic for filtering out even numbers
function isEven(x) {
return x % 2 === 0;
}
而已!我们现在只需要将主数组以及逻辑函数传递给我们`filterFunction`,如下所示:
// For filtering out odd numbers
filterFunction(arr, isOdd)
// Output of console.log(filterFunction(arr, isOdd)):
// [ 1, 3, 5, 7, 9, 11 ]
// For filtering out even numbers
filterFunction(arr, isEven)
// Output of console.log(filterFunction(arr, isEven)):
// [ 2, 4, 6, 8, 10 ]
通过这种方式,我们将逻辑函数(如`isOdd`或`isEven`作为参数)传递给另一个函数`filterFunction`。 我们基本上是从 main 函数中抽象出主要的过滤逻辑。我们现在可以根据需要传递任何其他过滤逻辑,`filterFunction`而无需更改它。
例如,如果我们想过滤掉一个大于 5 的数字,那么我们只需要编写如下过滤逻辑:
function isGreaterThanFive(x) {
return x > 5;
}
并将其作为参数传递给`filterFunction`:
filterFunction(arr, isGreaterThanFive)
// Output of console.log(filterFunction(arr, isGreaterThanFive)):
// [ 6, 7, 8, 9, 10, 11 ]
我们还可以将逻辑函数作为箭头函数传递并得到相同的结果——也就是说,`(x) => x > 5)`代替传递`isGreaterThanFive`将给我们相同的结果。
filterFunction(arr, (x) => x > 5)
// Output of console.log(filterFunction(arr, (x) => x > 5)):
// [ 6, 7, 8, 9, 10, 11 ]
## 程序员的面试题库 [web前端面试题库 VS java后端面试题库大全]( )
**前端资料汇总**

我一直觉得技术面试不是考试,考前背背题,发给你一张考卷,答完交卷等通知。
首先,技术面试是一个 认识自己 的过程,知道自己和外面世界的差距。
更重要的是,技术面试是一个双向了解的过程,要让对方发现你的闪光点,同时也要 试图去找到对方的闪光点,因为他以后可能就是你的同事或者领导,所以,面试官问你有什么问题的时候,不要说没有了,要去试图了解他的工作内容、了解这个团队的氛围。
找工作无非就是看三点:和什么人、做什么事、给多少钱,要给这三者在自己的心里划分一个比例。
最后,祝愿大家在这并不友好的环境下都能找到自己心仪的归宿。