如何早破减少()方法?

2022-08-30 04:11:22

如何打破方法的迭代?reduce()

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)

答案 1

更新

一些评论员提出了一个很好的观点,即原始数组正在被突变,以便在逻辑内部早期中断。.reduce()

因此,我通过添加一个在调用后续步骤之前添加一个答案来稍微修改了答案,从而生成原始数组的副本。注意:完成相同任务的类似操作是(不太明确)和传播运算符(性能稍差)。请记住,所有这些都会给整个运行时 + 1*(O(1))增加一个额外的线性时间常数因子。.slice(0).reduce()slice()[...array]

该副本用于保护原始阵列免受导致迭代弹出的最终突变的影响。

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']

您可以通过改变 reduce 函数的第 4 个参数“array”来中断 .reduce() 调用的任何迭代。无需自定义 reduce 函数。有关参数的完整列表,请参阅文档.reduce()

Array.prototype.reduce((acc, curr, i, array))

第 4 个参数是要迭代的数组

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

为什么?:

我能想到的使用它而不是提出的许多其他解决方案的唯一原因是,如果你想在你的算法中维护一个函数式编程方法,并且你想要最声明性的方法来实现这一点。如果你的整个目标是从字面上将数组简化为一个替代的非假原语(字符串,数字,布尔值,符号),那么我认为这实际上是最好的方法。

为什么不呢?

有一个完整的参数列表可以用于不改变函数参数,因为这是一种不好的做法。


答案 2

不要使用 reduce。只需使用普通迭代器(for等)迭代数组,并在满足条件时中断。