#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"));