JavaScript «If Statement» не возвращает истинное значение

#javascript #arrays #if-statement #foreach #boolean

#javascript #массивы #if-statement #предначертание #логическое

Вопрос:

Я написал простую функцию, которая проверяет, является ли предоставленная заметка действительной, путем перебора массива и сравнения значений.

Код всегда возвращается 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")); 

Ответ №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"));