假设我们有一个进行昂贵计算的函数和一个用于计算的源值数组。我们想要获得函数的第一个不为空的返回值并返回它。
function expensiveFunction(params) {...}
// this is how it can be achieved using ordinary for loop
let paramsCollection = ["params1", "params2" /*, ...*/];
let result;
for (let i=0; i<paramsCollection.length; i++) {
result = expensiveFunction(paramsCollection[i]);
if (result) {
break;
}
}
我想使用数组方法来做到这一点。
Array.find
只会返回函数返回某些内容的元素。
Array.map
将为所有元素运行昂贵的计算,即使第一个元素没问题。
Array.reduce
可以完成这项工作,但无论如何它都会迭代数组 - 即使它不调用 expensiveFunction
感觉很糟糕..
let paramsCollection = ["params1", "params2" /*, ...*/];
let result = paramsCollection.reduce((acc, cur) => acc ? acc : expensiveFunction(cur), null);
知道如何做到这一点,但没有上述示例的缺点吗?
您可以根据
mapFind
编写自己的Array.prototype.find
:
function mapFind(arr, f) {
let result;
arr.find(el => {
let temp = f(el);
if (temp) result = temp;
return result;
});
return result;
}
function expensiveFunction(params) {
return params > 7 ? params * params : 0;
}
console.log(mapFind([1, 2, 3], expensiveFunction));
console.log(mapFind([7, 8, 9], expensiveFunction));