这里有一些代码针对expensiveOperation
函数运行数组中的每个值,并返回符合某些条件的第一个代码。
let result = [1, 2, 3, 4, 5].find(value => {
let newValue = expensiveOperation(value)
return meetsCritera(newValue)
}
result = expensiveOperation(result)
但是find
函数返回的是数组值(例如3
),而不是expensiveOperation(3)
的结果。要获得最终值,我需要在expensiveOperation
的正文之外再次运行find
。
如何避免再次运行并从find
返回所需的值。还有其他ES6阵列功能可以让我这样做吗?
答案 0 :(得分:2)
你可以随时使用一个好的旧循环:
let result;
for (let value of [1, 2, 3, 4, 5]) {
let newValue = expensiveOperation(value);
if (meetsCritera(newValue)) {
result = newValue;
break;
}
}
答案 1 :(得分:1)
如果符合条件,您可以使用Array#some
并退出循环。
var expensiveOperation = a => 3 * a,
meetsCritera = v => v > 10,
result = (() => {
var newValue;
return [1, 2, 3, 4, 5].some(value => {
newValue = expensiveOperation(value);
return meetsCritera(newValue);
}) && newValue;
})();
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:1)
.reduce
这是一个不错的用例。
let result = [1, 2, 3, 4, 5].reduce((result, value) => {
if (result) return result;
let newValue = expensiveOperation(value)
if (meetsCritera(newValue)) return newValue;
}, null);