首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript "If语句“未返回真值

JavaScript "If语句“未返回真值
EN

Stack Overflow用户
提问于 2020-11-20 23:10:22
回答 2查看 71关注 0票数 0

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

代码总是返回false,我不知道为什么?

当我孤立地运行代码item.split("/")[1] == note时,它返回true (注释= "C“),那么为什么我的函数总是返回false

代码语言:javascript
复制
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"));

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-20 23:12:31

forEach忽略其回调返回的任何值。使用for循环,这样return将返回到isValidNote的调用方,而不是被forEach忽略

代码语言:javascript
复制
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"));

或者,更简单地说:

代码语言:javascript
复制
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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-11-20 23:14:05

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

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

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64938124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档