【问题标题】: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"));