【问题标题】:Avoid no-sequences inside map function避免 map 函数中的无序列
【发布时间】:2020-03-10 10:38:45
【问题描述】:

我有一个要循环的数组,所以我使用地图原型。 在每个元素的 callbackfn 中,我想运行几个表达式。

const test = [{ name: "foo", value: "1" }, { name: "bar", value: "2" }, { name: "x", value: "3" }]
  let found = false;
  test.map(name => (
    console.log(name.name),
    console.log(name.value),
    found = true
  ));

我用, 分隔每个表达式。虽然这可以正确运行并产生正确的结果,但我可以看到我的 eslint 说 Unexpected use of comma operator no-sequences

我的意思是如何在 map 函数中放置多个表达式?

【问题讨论】:

  • 应该是; 而不是,
  • map 将一种数组转换为另一个数组。您是否正在寻找 filter 或许作为真伪测试?
  • @AZ_ OP 似乎正在使用括号,这会使使用分号成为语法错误。
  • @DanielJ 使用代码块 {} 作为函数体,然后使用 ; 结束每个语句。如果您只想循环,您可以使用forEach 而不是map,因为map 返回一个new 数组(请参阅有关如何正确使用map 的文档)跨度>
  • @DanielJ 使用花括号代替映射函数体的括号。

标签: javascript ecmascript-6


【解决方案1】:

我的意思是如何在 map 函数中放置多个表达式?

使用花括号:

test.map(name => {
   console.log(name.name)
   console.log(name.value)
   found = true
});

虽然 map 看起来不像其他人指出的那样是正确的选择 - 看起来您应该使用 filter,但相同的规则适用于多个语句。

普通括号是“隐含返回”的简写,如果您的函数只包含一个表达式,您可以省略{}return 关键字。事实上,你通常也可以省略括号!

所以这些是等价的:

test.filter(name => {
    let found = false
    if(name==='sarah'){
       found = true
    }
    return found 
}

test.filter(name => name === 'sarah')

【讨论】:

  • 感谢@Will Jenkins,工作完美。
  • 看起来他的意图不是过滤数组,而是检查是否存在值。过滤器将起作用,但即使第一项匹配,也会在整个数组中迭代。 Array.some() 是正确的。
  • 啊,好吧,虽然这个意图有点跑题了,但是
  • 嗨@WillJenkins,我又遇到了这个问题。在反应中,我需要使用 .map 来返回多个组件。 jsfiddle.net/v4gLkxjy 但在这种情况下,如果我被告知 Expected an assignment or function call and instead saw an expression 如果不是花括号,而是括号,而不是分号,而是逗号,我的代码将按预期工作
  • 如果你需要返回一个组件(并且你正在使用带有多个表达式的{}),你需要在最后return 一些东西!
【解决方案2】:

为了我评论的完整性,请使用forEach 和其他人提到的内容。

const test = [{ name: "foo", value: "1" }, { name: "bar", value: "2" }, { name: "x", value: "3" }]
  let found = false;
  test.forEach(name => {
    console.log(name.name);
    console.log(name.value);
    found = true;
  });

【讨论】:

    【解决方案3】:

    您的代码中有语法错误,因为具有多行代码的箭头函数的正确语法是:

    (params) => {
      // Your code here with semicolon at line end
    }
    

    注意在行尾使用花括号代替括号,用分号代替逗号。

    另外,由于您在内部寻找一些价值并且不关心它的位置,您可以使用Array.some() 代替。它会更有效,因为它会在第一个结果上停止:

    let found = test.some((name) => {
      if (your condition here) {
        return true;
      } else {
        return false;
      }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-31
      • 2020-01-22
      • 2011-07-25
      • 2011-06-15
      • 2016-09-24
      • 2019-02-15
      • 1970-01-01
      • 2013-10-03
      相关资源
      最近更新 更多