【问题标题】:Should I use array methods like map and filter, if I'm not going to return anything?如果我不打算返回任何东西,我应该使用 map 和 filter 之类的数组方法吗?
【发布时间】:2018-10-12 21:07:59
【问题描述】:

在过去的一年里,我更频繁地使用像 mapfilter 这样的数组方法,而不是数组上的标准 for 循环。它读起来和写起来感觉更简单,而且做所有我最有可能做的事情,比如创建一个局部变量。

但我通常不会返回任何东西。不过,埃斯林特不太喜欢我。据他们说,他们说你总是需要退货,否则它“可能是一个错误” https://eslint.org/docs/rules/array-callback-return

为什么?只是好的做法?无返回数组方法的缺点是什么?

想了很久。任何见解或想法都会很棒。

【问题讨论】:

  • 如果不使用这些函数的结果,为什么要使用map/filter而不是forEach
  • ESLint 是正确的 - 如果您在 mapfilter 回调中没有 return 语句,那么您确实很可能在滥用它。他们依靠返回值来运作。否则,您只是无缘无故地遍历数组。在这种情况下,您应该使用.forEach
  • 您也可以使用for...of loop
  • 老实说,不知道为什么我没有考虑 forEach。这也是我使用 eslint 的原因,因为在我改变之前,它会让我很恼火。 :)
  • 根据回复,我向 eslint 文档添加了一个拉取请求,以帮助指导其他人。谢谢你们。 github.com/eslint/eslint/pull/10301

标签: javascript arrays ecmascript-6 eslint


【解决方案1】:

如果我不打算返回任何东西,我应该使用 map 和 filter 之类的数组方法吗?

不,你不应该。

为什么?只是好的做法吗?

是的。对您正在执行的迭代类型使用适当的迭代方法是一种很好的做法。有很多方法可以迭代是有原因的。选择合适的机制。

无返回数组方法的缺点是什么?

使用 .map().filter() 而不从回调中实际返回任何内容有以下缺点:

  1. 您的代码具有误导性。.map().filter() 的重点是遍历数组并生成一个新数组。当开发人员阅读一些代码并看到.map().filter() 被使用时,他们期望应该有一个返回的数组。当他们没有看到它以这种方式完成时,他们会感到困惑,最初会觉得他们不理解代码。如果我对这样的代码进行代码审查,我不会批准这样的代码。

  2. 您的代码不必要地创建了未使用的对象。这只是浪费而且不是一个好的做法。相反,请使用不会产生输出数组的迭代方法,例如for/of、常规for 循环或.forEach()

  3. 您的代码不会 lint。 Linters 对事物提出异议是有原因的。正如 linter 所说,使用 .map().filter() 而不从回调中返回任何内容是“可能是一个编程错误”,因为这不是这些函数的设计方式,并且当你不使用时有适当的替代方案想要一个返回的数组。

因此,如果您只是尝试在不创建任何结果数组的情况下进行迭代,请使用 for/of.forEach() 或其他并非专门用于创建您不创建的输出数组的迭代方案想要。

【讨论】:

  • 这基本上不是亚当的回答吗?
  • @JonasW。 - 一点都不。这是一个更完整的答案,直接解决了 OP 提出的问题并解释了推理。此外,亚当的回答只提到了我提到的三点之一。堆栈溢出的想法是尽可能写出最好的答案。你认为亚当的答案比这个更好、更完整吗?
  • @JonasW。如果你要走那条路,这里的所有答案基本上都是一样的。因为这里的核心问题是 OP 似乎并不了解数组方法及其用法。然而,每个人都可以以不同的方式解释事物,因此它们都可以使用
  • @vlaz 仍然不能证明对他的回答投了两次反对票。
  • @JonasW。也许是这样。然而它也是完全无关的。
【解决方案2】:

首先您需要了解 Map/Filter 和 forEach 之间的区别。

resuming.. forEach 主要用于当您想要使用/作为过程迭代数组时。 check

Map 和 Filter 与在每次迭代中应用的回调函数相关。 那些的 return 语句将被评估,而不是最后的 Map/Filter 函数。需要它的原因。尽管 JS 允许“任意”,当然您也可以将我们所理解的功能定义为“过滤器”。

对于过滤器,您可以看到“真”和“假”作为“数据”是否要被过滤。

【讨论】:

    【解决方案3】:

    基本上你可以用mapforEach/for循环,区别如下:

    foreach: 这将遍历一个列表并对每个列表成员应用一些具有副作用的操作,这意味着您正在转换您正在循环的当前数组.... 或如@所注意到的那样TiagoCoelho,你根本不会弄乱数组,只是循环思考。

    ma​​p:这会遍历一个列表,转换该列表的每个成员,并返回另一个与转换后的成员大小相同的列表,这意味着您将获得一个全新的数组修改过的项目,您还将在内存中保存旧数组。

    所以基本上这取决于你想对数组中的数据做什么。

    参考文献

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEachhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

    例子:

    var a = [1, 2, 3, 4];
    var b = [1, 2, 3, 4];
    //multiply each item for 2, it will stay on the same array.
    a.forEach(i => {
      i = i * 2
    })
    
    
    //multiply the items of B for 2 but it will return a new array
    var c = b.map(i => {
      return i * 2
    })
    
    console.log(a); //modified reference
    console.log(b); //stays the same
    console.log(c); //new array

    【讨论】:

    • foreach 不需要你修改当前数组...你可能正在对另一个数组或变量做某事,或发送网络请求,或 console.logs 或其他任何东西
    • @TiagoCoelho 你是对的,我会更新我的答案。
    • mapforEach 都不会更改调用这些函数的数组。如果您对传递给回调的元素进行了更改,mapforEach 都会修改存储在数组中的元素。
    • 另外,您的示例不会更改原始数组
    • @TiagoCoelho 实际上,.forEach 根本修改数组,除非您自己手动修改。
    猜你喜欢
    • 2017-05-28
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    相关资源
    最近更新 更多