我怎样才能打破迭代reduce()
method?
for
:
for (var i = Things.length - 1; i >= 0; i--) {
if(Things[i] <= 0){
break;
}
};
reduce()
Things.reduce(function(memo, current){
if(current <= 0){
//break ???
//return; <-- this will return undefined to memo, which is not what I want
}
}, 0)
您可以通过改变reduce函数的第四个参数:“array”来中断.reduce()调用的任何迭代。无需自定义缩减功能。看Docs完整列表.reduce()
参数。
Array.prototype.reduce((acc, curr, i, array))
第四个参数是array正在被迭代。
const array = ['apple', '-pen', '-pineapple', '-pen'];
const x = array
.reduce((acc, curr, i, arr) => {
if(i === 2) arr.splice(1); // eject early
return acc += curr;
}, '');
console.log('x: ', x); // x: apple-pen-pineapple
WHY?:
我能想到使用此解决方案而不是提出的许多其他解决方案的唯一原因是,如果您想为您的算法维护一种函数式编程方法,并且您希望使用最具声明性的方法来实现这一目标。如果您的整个目标是将数组从字面上减少为替代的非错误基元(字符串、数字、布尔值、符号),那么我认为这实际上是最好的方法。
WHY NOT?
有一个完整的参数列表可以用来避免改变函数参数,因为这是一种不好的做法。
UPDATE
一些评论员提出了一个很好的观点,即原始数组正在被变异,以便尽早打破数组内部。.reduce()
logic.
因此,我修改了答案slightly通过添加一个.slice(0)
在呼叫后续电话之前.reduce()
步骤,生成原始数组的副本。NOTE:完成相同任务的类似操作是slice()
(不太明确)和扩展运算符[...array]
(性能稍差)。请记住,所有这些都会为整体运行时间增加一个额外的线性时间常数因子... + O(n)
.
该副本用于保护原始数组免受导致迭代弹出的最终突变的影响。
const array = ['apple', '-pen', '-pineapple', '-pen'];
const x = array
.slice(0) // create copy of "array" for iterating
.reduce((acc, curr, i, arr) => {
if (i === 2) arr.splice(1); // eject early by mutating iterated copy
return (acc += curr);
}, '');
console.log("x: ", x, "\noriginal Arr: ", array);
// x: apple-pen-pineapple
// original Arr: ['apple', '-pen', '-pineapple', '-pen']
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)