FlatMap 与 Reduce 用于映射和过滤 - 是否推荐使用其中一种?

Loc*_*tKs 5 javascript arrays

根据此 SO threadflatMap或者reduce当需要映射和过滤一组对象时推荐,特别是如果他们想避免多次循环遍历集合。就我个人而言,我更喜欢使用它flatMap,因为我认为它更容易阅读,但这当然完全是主观的。除了 的浏览器兼容性问题之外flatMap,是否普遍推荐一种方法或比另一种方法更有利(可能是因为但不限于性能或可读性的原因)?

更新:这是来自 flatMap 过滤的参考答案的示例:

var options = [{
    name: 'One',
    assigned: true
  },
  {
    name: 'Two',
    assigned: false
  },
  {
    name: 'Three',
    assigned: true
  },
];

var assignees = options.flatMap((o) => (o.assigned ? [o.name] : []));
console.log(assignees);

document.getElementById("output").innerHTML = JSON.stringify(assignees);
Run Code Online (Sandbox Code Playgroud)
<h1>Only assigned options</h1>
<pre id="output"> </pre>
Run Code Online (Sandbox Code Playgroud)

Ber*_*rgi 5

实际上也不是。对于映射和过滤,您应该使用mapand filter

var assignees = options.filter(o => o.assigned).map(o => o.name);
Run Code Online (Sandbox Code Playgroud)

更简单、更易读,它直接表达了您的意图。在清晰度方面没有什么比这更好的了。

如果您关心性能,请始终进行基准测试以查看对实际案例的实际影响 - 但不要过早优化。

  • 过滤器后跟映射应该在单次迭代而不是两次迭代中使用归约来完成。 (3认同)
  • @AdrianBrand 如果你关心单次传递,那么应该使用迭代器来完成,但我怀疑在大多数情况下性能很重要。如果你知道它确实如此,你无论如何都会做一个基准测试,并且可能使用一个普通的循环而不是一些有副作用的“reduce”。 (2认同)
  • @AdrianBrand它可能不会从“reduce”调用中流出,但它确实从回调函数中流出,这使得*那个*不纯。我认为绝对没有比 `const assetees = []; 更好的地方 for (const item of options) if (item.signed) allocateees.push(item);` (2认同)