【问题标题】:JavaScript "If Statement" not returning true valueJavaScript“If 语句”不返回真值
【发布时间】:2021-03-04 09:07:20
【问题描述】:

我编写了一个简单的函数,通过遍历数组并比较值来检查提供的注释是否有效。

代码总是返回false,我不确定为什么?

当我单独运行代码 item.split("/")[1] == note 时,它会返回 true(带有 note = "C" )那么为什么我的函数总是返回 false

const chromatic = ["A", "A#/Bb", "B/Cb", "B#/C", "C#/Db", "D", "D#/Eb", "E", "E#/Fb", "F", "F#/Gb", "G", "G#/Ab"];

const isValidNote = (note) => {

  chromatic.forEach((item) => {
    if (item.split("/").length > 1) {

      console.log(item.split("/")[1] == note); // logs true on 3rd iteration

      if (item.split("/")[0] == note) return true;
      if (item.split("/")[1] == note) return true;
    } else if (item == note) {
      return true;
    }
  });
  return false;
}

console.log(isValidNote("C"));

【问题讨论】:

    标签: javascript arrays if-statement foreach boolean


    【解决方案1】:

    forEach 忽略其回调返回的任何值。改用for 循环,这样return 将返回给isValidNote 的调用者,而不是被forEach 忽略:

    const chromatic = ["A", "A#/Bb", "B/Cb", "B#/C", "C#/Db", "D", "D#/Eb", "E", "E#/Fb", "F", "F#/Gb", "G", "G#/Ab" ];
    
    const isValidNote = (note)=> {
    
        for (const item of chromatic) {
            if(item.split("/").length > 1){
                if(item.split("/")[0] == note) return true;
                if(item.split("/")[1] == note) return true;
            }
            else if(item == note){
                return true;
            }
        }
        return false;
    }
    
    console.log(isValidNote("C"));

    或者,更简洁:

    const chromatic = ["A", "A#/Bb", "B/Cb", "B#/C", "C#/Db", "D", "D#/Eb", "E", "E#/Fb", "F", "F#/Gb", "G", "G#/Ab" ];
    
    const isValidNote = (note)=> {
    
        for (const item of chromatic) {
            const allNotes = item.split("/");
            if (allNotes.includes(note)) {
                return true;
            }
        }
        return false;
    }
    
    console.log(isValidNote("C"));

    或者.some:

    const chromatic = ["A", "A#/Bb", "B/Cb", "B#/C", "C#/Db", "D", "D#/Eb", "E", "E#/Fb", "F", "F#/Gb", "G", "G#/Ab" ];
    
    const isValidNote = note => chromatic.some(
      item => item.split("/").includes(note)
    );
    
    console.log(isValidNote("C"));

    【讨论】:

      【解决方案2】:

      forEach() 回调返回只是继续循环,它不会从isValidNote() 函数返回。

      使用some() 而不是forEach()。如果任何回调返回 true,则返回 true。

      您还可以使用includes() 简化回调内部的条件。

      const chromatic = ["A", "A#/Bb", "B/Cb", "B#/C", "C#/Db", "D", "D#/Eb", "E", "E#/Fb", "F", "F#/Gb", "G", "G#/Ab"];
      
      const isValidNote = note => chromatic.some(item => item.split("/").includes(note));
      
      console.log(isValidNote("C"));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-17
        • 2011-04-12
        • 2018-11-09
        • 2016-02-12
        相关资源
        最近更新 更多