【问题标题】:Simplifying function to check array matches简化检查数组匹配的函数
【发布时间】:2021-02-11 22:40:18
【问题描述】:

我正在尝试编写一个函数来检查传递的 arg 是否等于数组中的条件之一。

例如:

function doesMatch(passedData) {
  return (
    passedData === "blue" ||
    passedData === "green" ||
    passedData === "red"
  );
}

如果传递的值与任何数据匹配,那么它将返回 true。如果它没有找到匹配项,则返回 false,我们知道它不是匹配项。

工作正常,但看起来很乱(有比这更多的数据)。我试图让它与 .forEach 和一个包含所有要测试的值的数组一起工作,但我不太正确。

function doesMatch(passedData) {
    ["blue", "green", "red"].forEach((colour) => {
        return passedData === colour
    });
}

如何使我的后一个函数与前一个函数具有相同的结果?我哪里错了?

【问题讨论】:

标签: javascript arrays


【解决方案1】:

Array.prototype.forEach不起作用的原因是因为回调的return值被忽略了-

function doesMatch (passedData)
{ let matched = false;
    ["blue", "green", "red"].forEach((colour) => {
        if (colour === passedData)
          matched = true;
    });
    return matched;
}

console.log(doesMatch("red"));    // true
console.log(doesMatch("cyan"));   // false

但是我们可以使用for..of循环更简洁地写这个-

function doesMatch (query)
{ for (const colour of ['blue', 'green', 'red']) 
    if (colour === query)
      return true
  return false
}

console.log(doesMatch("red"))     // true
console.log(doesMatch("cyan"))    // false

或者如果你想使用箭头表达式,我们可以使用Array.prototype.some -

const doesMatch = q =>
  ['blue', 'green', 'red'].some(colour => colour === q)

console.log(doesMatch("red"))     // true
console.log(doesMatch("cyan"))    // false

Felix 建议使用switchSet/Set.prototype.has 也是一个很好的建议!

【讨论】:

    【解决方案2】:

    使用各种数据结构有多种选择,但我认为最合理的选择是使用switch 语句或Set

    切换语句

    function doesMatch(passedData) {
      switch(passedData) {
        case "blue":
        case "green":
        case "red":
          return true;
        default:
          return false;
      }
    }
    

    设置

    const values = new Set(['blue', 'green', 'red']);
    
    function doesMatch(passedData) {
      return values.has(passedData);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多