JavaScript / Node.JS - 使用OR运算符的紧凑方式?

时间:2017-11-06 03:41:57

标签: javascript node.js variables operators var

我们说我有检查字符串的情况。我需要检查它是否与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 是否以<{strong>中的任何值开头myVar 1}?如果有人有小费,那将非常感激。谢谢!

5 个答案:

答案 0 :(得分:5)

使用带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!")
}

答案 1 :(得分:1)

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!");
}

答案 2 :(得分:1)

我可能会在前缀数组上使用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,如果要多次执行代码,它可能会更快(取决于前缀的数量和大小)(第一次会有惩罚)你从一个字符串构建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",那么您可能需要预先计算所有可能的选项:< / p>

  • 使用数组(或设置为@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和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));

答案 3 :(得分:0)

使用includes;根据您的编辑:

const allowed = ['a','b','ccc'];

if( allowed.includes(`${ message }test`) ) {
    console.log("success!")
}

答案 4 :(得分:0)

使用包含和香草

的示例

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.