为了账号安全,请及时绑定邮箱和手机立即绑定

减少和无法在 Javascript 中摆脱它到底是什么?

减少和无法在 Javascript 中摆脱它到底是什么?

幕布斯7119047 2021-07-13 12:00:17
为什么我不能reduce在 Javascript 中跳出 a ?看起来简单return甚至一个throw都不会破坏它。究竟为什么需要遍历所有值?
查看完整描述

2 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

因为这就是它的设计目的 - 它将始终循环遍历数组中的所有项目,就像大多数其他数组方法一样forEach,例如和map。


如果过了某个时间点,您想有效地忽略之后发生的事情,只需返回当前累加器,例如:


const partialSum = [1, 2, 3, 4].reduce((a, num) => {

  if (a > 3) {

    return a;

  }

  return a + num;

}, 0);


console.log(partialSum);

如果你想在数组中找到一个元素,你应该使用.find,它会在找到匹配项后立即终止循环:


const arr = [

  { prop: 'foo' },

  { prop: 'bar' },

  { prop: 'baz' }

];

const foundBar = arr.find((obj) => {

  console.log('iteration');

  return obj.prop === 'bar';

});

Athrow 确实会跳出 a .reduce(尽管您不应该使用错误进行控制流):


[1, 2, 3, 4, 5].reduce((a, num) => {

  console.log('iteration');

  if (num > 2) {

    throw new Error();

  }

});


查看完整回答
反对 回复 2021-07-15
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

如果您的代码库似乎经常需要在 a 内部中断reduce,那么改用for循环可能是一个更好的主意。但是,如果您绝对必须使用reduce并且需要从内部中断,则可以使用以下选项之一:

  • 在您需要中断的点之后,返回当前累加器而不更改每个元素。

  • 使用throw打破了出来reduce的方法,但不建议这样做。

  • 4th改变 reducer 函数的参数,它是被迭代的数组。如果将其变异为空数组,reduce则将退出。小心这一点,因为它可能会产生不必要的副作用。

reduce旨在迭代数组中的所有元素,因此这就是为什么要突破它并不容易、不常见或不推荐的原因。这也是为什么有这么多其他数组操作方法的原因,理论上reduce 可以在给定适当功能的情况下替换所有这些方法,但是它存在其他数组方法没有的某些限制。


查看完整回答
反对 回复 2021-07-15
  • 2 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信