JavaScript "If Statement" 没有返回真值

JavaScript "If Statement" not returning true value

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

代码总是 returns false 我不确定为什么?

当我 运行 代码 item.split("/")[1] == note 孤立时 returns true (注意 = "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"));

forEach 忽略由其回调编辑的任何值 return。而是使用 for 循环,这样 return 将 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"));

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

使用 some() 而不是 forEach()。如果任何回调 return 为真,则它 return 为真。

您还可以使用 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"));