【问题标题】:JavaScript/Node.JS - compact way of using OR operator?JavaScript/Node.JS - 使用 OR 运算符的紧凑方式?
【发布时间】:2018-04-18 04:07:04
【问题描述】:

假设我有一个检查字符串的情况。我需要检查它是否匹配a 或匹配b。现在,当然,我可以这样做

var firstVar = "a"
var secondVar = "b"
var message = "atest" // note that I might not know what message is. it could be anything. it could be just "test" or just "a"
if ((message === firstVar + "test") || (message === secondVar + "test")) {
   console.log("success!")
}

但是有什么办法可以压缩它吗?与将myVar 设为具有ab 值的数组有关的事情,然后检查message myVar 中的任何值开始吗?如果有人有小费,那将不胜感激。谢谢!

【问题讨论】:

  • 你可以使用 ES6 吗?如果是这样,您可以使用includes,否则对于香草ES5,您可以创建一个数组并执行indexOf
  • @MikeTung 你能链接我或给我一个使用includes的例子吗?
  • 您可以使用Array.prototype.some().find().findIndex()
  • @APixelVisuals我为您发布了示例。
  • 嘿,我想我举了一个不好的例子,我已经编辑了原始帖子。对此感到抱歉

标签: javascript node.js variables operators var


【解决方案1】:

使用带有some 的数组将是最简单的方法:

var tests = ["a", "b"];
var message = "atest";
if (tests.some(function(t) { return message === t + "test"; })) {
    console.log("success!")
}

如果你可以使用 ES6 并且需要经常运行这个检查,那么使用它可能是有意义的

const choices = new Set(["a", "b"].map(t => t + "test"));
…
var message = "atest";
if (choices.has(message)) {
    console.log("success!")
}

【讨论】:

    【解决方案2】:

    ES5:

    var vars = ["a", "b"].map(function(v) {
      return v + "test";
    });
    var message = "atest";
    if (vars.indexOf(message) > -1) {
       console.log("success!");
    }

    ES6:

    var vars = ["a", "b"].map(v => v + "test");
    var message = "atest";
    if (vars.includes(message)) {
       console.log("success!");
    }

    【讨论】:

    • 我想我举了一个不好的例子,我编辑了原始帖子。对此感到抱歉
    • @APixelVisuals 已编辑
    • nope 似乎不起作用...它没有进入 if 语句
    • @APixelVisuals 两者都可以在支持 ES6 的环境中正常工作。 ES6 不适用于不支持 ES6 的环境。您是否尝试单击“运行代码 sn-p”按钮?如果是,是 ES5 的一个工作,而 ES6 一个没有?
    • @APixelVisuals 我只是在每一行的末尾添加了一些分号,但是这些不是必需的。
    【解决方案3】:

    我可能会在前缀数组上使用Array.prototype.some,然后...:

    • 如果前缀都是单个字符,就做messsage[0] === prefix,这应该是最快的选项(没有函数调用也没有字符串连接,只是一个简单快速的比较运算符。

      const prefixes = ["a", "b"];
      const message1 = "atest";
      const message2 = "btest";
      const message3 = "ctest";
      
      console.log(prefixes.some(prefix => message1[0] === prefix));
      console.log(prefixes.some(prefix => message2[0] === prefix));
      console.log(prefixes.some(prefix => message3[0] === prefix));
    • 如果前缀可以包含多个字符(也适用于单个字符),那么我会使用 message.indexOf(prefix) === 0:

      const prefixes = ["at", "bt"];
      const message1 = "atest";
      const message2 = "btest";
      const message3 = "ctest";
      
      console.log(prefixes.some(prefix => message1.indexOf(prefix) === 0));
      console.log(prefixes.some(prefix => message2.indexOf(prefix) === 0));
      console.log(prefixes.some(prefix => message3.indexOf(prefix) === 0));

    您还可以构建和使用RegExp,如果您要多次执行代码(它会在您第一次构建时受到惩罚),它可能会更快(取决于前缀的数量和大小)字符串中的正则表达式,但你只是一遍又一遍地重用那个):

    • 如果前缀是单个字符:

      const prefixes = ["a", "b"];
      const message1 = "atest";
      const message2 = "btest";
      const message3 = "ctest";
      
      const regexp = new RegExp(`^[${ prefixes.join('') }]`);
      
      console.log(regexp.test(message1))
      console.log(regexp.test(message2))
      console.log(regexp.test(message3))
    • 如果前缀是多个字符(也适用于单个字符):

      const prefixes = ["at", "bt"];
      const message1 = "atest";
      const message2 = "btest";
      const message3 = "ctest";
      
      const regexp = new RegExp(`^(${ prefixes.join('|') })`);
      
      console.log(regexp.test(message1))
      console.log(regexp.test(message2))
      console.log(regexp.test(message3))

    如果您想检查 message 是否实际上是这些前缀中的任何一个以及其他前缀的组合,例如您的示例中的 "test",那么您可能需要预先计算所有可能的选项:

    • 使用数组(或按照@Bergi 的建议设置)和Array.prototype.includesArray.prototype.indexOf

      const prefixes = ["a", "b"];
      const word = "test";
      const options = prefixes.map(prefix => `${ prefix }${ word }`);
      const message1 = "atest";
      const message2 = "btest";
      const message3 = "ctest";
      
      console.log(options.includes(message1));
      console.log(options.includes(message2));
      console.log(options.includes(message3));
      
      console.log(options.indexOf(message1) !== -1);
      console.log(options.indexOf(message2) !== -1);
      console.log(options.indexOf(message3) !== -1);
    • 使用正则表达式和RegExp.prototype.testString.prototype.match

      const prefixes = ["a", "b"];
      const word = "test";
      const regexp = new RegExp(`^(${ prefixes.join("|") })${ word }`);
      const message1 = "atest";
      const message2 = "btest";
      const message3 = "ctest";
      
      console.log(regexp.test(message1));
      console.log(regexp.test(message2));
      console.log(regexp.test(message3));
      
      console.log(!!message1.match(regexp));
      console.log(!!message2.match(regexp));
      console.log(!!message3.match(regexp));

    【讨论】:

      【解决方案4】:

      includes 和 vanilla 使用示例

      ES6 方式

      const testArray = [1,2,3];
      
      testArray.includes(1); //returns true
      testArray.includes(24); //returns false
      

      ES5方式

      var testArray = [1,2,3];
      testArray.indexOf(1) // returns 1 since its a member.
      testArray.indexOf(43) //returns -1 since it's not a member.
      

      【讨论】:

      • 我想我举了一个不好的例子,我编辑了原始帖子。对此感到抱歉
      • 您所做的只是处理文本,您可以编写一个函数来处理它,然后使用两个示例来解决。
      【解决方案5】:

      使用includes;根据您的编辑:

      const allowed = ['a','b','ccc'];
      
      if( allowed.includes(`${ message }test`) ) {
          console.log("success!")
      }
      

      【讨论】:

      • 我想我举了一个不好的例子,我编辑了原始帖子。对此感到抱歉
      • 刚刚尝试过,但没有成功。它只是没有进入 if 语句
      • 问题有message === firstVar + "test",意思是{ message }test...应该是正确的,但这里有很多答案,我怀疑这很重要;)
      • @Dominik 它仍然存在。但是即使message 的值类似于"a_hello",您的示例也不会评估为true
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 2015-07-08
      相关资源
      最近更新 更多