【问题标题】:How to avoid multiple computations within `map` callback?如何避免在`map`回调中进行多次计算?
【发布时间】:2019-05-24 17:22:01
【问题描述】:

我写了以下用于规范化向量的“单线”(此处由通常的数组表示),这意味着将每个条目除以向量的欧几里得范数。

normalize = v => v.map(x => x/Math.sqrt(v.map(x => x * x).reduce((a, b) => a + b)))

不幸的是,它效率不高,因为每个条目都会一遍又一遍地计算规范。我们能否以一种避免重复评估的方式修改这个“单行”?

编辑:我发现的一种方法 - 不是特别优雅且可读性不强 - 需要向最外层的 lambda 添加另一个输入参数并将其用作规范的输入:

 normalize = w => (norm => w.map(x => x / norm))(Math.sqrt(w.map(x => x * x).reduce((a, b) => a + b)))

【问题讨论】:

  • 只是……不要写成一行然后再拆分一下……?即使是最初的版本也很难阅读。大概这不是打代码打高尔夫球,写一个班轮不是目标。

标签: javascript arrays callback closures


【解决方案1】:

只是不要太聪明了……

const normalize = v => {
    const norm = Math.sqrt(v.map(x => x * x).reduce((a, b) => a + b)));
    return v.map(x => x / norm);
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    相关资源
    最近更新 更多