首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaScript是否优化了多个纯过滤器/映射/等等?

JavaScript是否优化了多个纯过滤器/映射/等等?
EN

Stack Overflow用户
提问于 2019-04-14 22:55:42
回答 2查看 348关注 0票数 4

我用函数式编写了这个JavaScript代码:

代码语言:javascript
运行
复制
someArray
  .filter((element) => element)
  .map((element) => element.property)
  .map((property) => doSomethingWithIt)

现在,一个天真的实现将在数组上循环三次--对于每个filtermap-but,一个优化器应该能够将其优化为执行多个操作的一个循环,前提是所有函数都是纯的。

做(最多?)JavaScript引擎对此进行优化;还是需要手动优化?

编辑:我所想到的优化就是将其简化为一个循环:

代码语言:javascript
运行
复制
someArray.reduce((acc, element) => {
  if(!element) {
    return acc
  }

  return acc.push(doSomethingWithIt(element.property))
}, [ ])
EN

回答 2

Stack Overflow用户

发布于 2019-04-14 23:12:56

优化器应该能够将其优化为执行多个操作的一个循环。

不,不应该!此优化可能会更改代码的行为。

考虑一个双map,其中每个map中的操作都有明显的副作用:

代码语言:javascript
运行
复制
let arr = [1, 2, 3];
arr.map((x) => { console.log("foo", x); return x })
   .map((y) => { console.log("bar", y); return y });

记录与“优化”版本不同的消息序列:

代码语言:javascript
运行
复制
let arr = [1, 2, 3];
arr.map((x) => {
    console.log("foo", x);
    console.log("bar", x);
    return x;
});

票数 4
EN

Stack Overflow用户

发布于 2019-04-14 23:12:36

除非希望数组中包含filter,否则不能删除undefined调用--但是,您可以使用析构将两个map调用转换为一个:

代码语言:javascript
运行
复制
someArray.filter(element => element).map(({ property }) => doSomething(property));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55680766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档