我用函数式编写了这个JavaScript代码:
someArray
.filter((element) => element)
.map((element) => element.property)
.map((property) => doSomethingWithIt)
现在,一个天真的实现将在数组上循环三次--对于每个filter
和map
-but,一个优化器应该能够将其优化为执行多个操作的一个循环,前提是所有函数都是纯的。
做(最多?)JavaScript引擎对此进行优化;还是需要手动优化?
编辑:我所想到的优化就是将其简化为一个循环:
someArray.reduce((acc, element) => {
if(!element) {
return acc
}
return acc.push(doSomethingWithIt(element.property))
}, [ ])
发布于 2019-04-14 23:12:56
优化器应该能够将其优化为执行多个操作的一个循环。
不,不应该!此优化可能会更改代码的行为。
考虑一个双map
,其中每个map
中的操作都有明显的副作用:
let arr = [1, 2, 3];
arr.map((x) => { console.log("foo", x); return x })
.map((y) => { console.log("bar", y); return y });
记录与“优化”版本不同的消息序列:
let arr = [1, 2, 3];
arr.map((x) => {
console.log("foo", x);
console.log("bar", x);
return x;
});
发布于 2019-04-14 23:12:36
除非希望数组中包含filter
,否则不能删除undefined
调用--但是,您可以使用析构将两个map
调用转换为一个:
someArray.filter(element => element).map(({ property }) => doSomething(property));
https://stackoverflow.com/questions/55680766
复制相似问题