分享
三行代码  ›  专栏  ›  技术社区  ›  kevin

编码挑战,努力找出如何从方法返回字符串

  •  1
  • kevin  · 技术社区  · 1 年前

    我正在处理一个代码挑战,如果猜测传入,我需要将字符串返回到变量中。 attemptAnswer(guess) 匹配 answer 属性的值。我的测试失败了,现在说变量 response 是未定义的。

    这是某种有约束力的问题吗?

    …好奇如何解决这个问题。

    谢谢您!

    class Sphinx {
        constructor() {
            this.name = null;
            this.riddles = [];
        }
        collectRiddle(riddle) {
            this.riddles.push(riddle);
            if (this.riddles.length > 3) { this.riddles.shift() };
        }
        attemptAnswer(guess) {
            this.riddles.forEach( (element, index) => {
                if (guess === element.answer) { 
                    this.riddles.splice(index, 1);
                    return "That wasn't that hard, I bet you don't get the next one."
                };
            })
        }
    }
    
    //test
     const response = sphinx.attemptAnswer('short');
     assert.equal(response, 'That wasn\'t that hard, I bet you don\'t get the next one');
    
    
    3 回复  |  直到 1 年前
        1
  •  0
  •   Nick Parsons    1 年前

    当你回来的时候 attemptAnswer() 你真的回到了内心 forEach 您定义的回调函数: (element, index) => {... 不是外在的 试用版() 方法。

    而不是立即返回 前额 循环,可以在此循环外设置一个变量,调用 result ,然后返回 结果 一旦你 前额 循环已完成。

    此外,当前您没有创建 Sphinx ,这意味着您没有可以调用 试用版() 方法。修复此添加 new Sphinx() 创建新的 狮身人面像 对象。

    见下例:

    class Sphinx {
      constructor() {
        this.name = null;
        this.riddles = [{"answer":"short"}];
      }
      collectRiddle(riddle) {
        this.riddles.push(riddle);
        if (this.riddles.length > 3) {
          this.riddles.shift()
        };
      }
      attemptAnswer(guess) {
        let res = "";
        this.riddles.forEach((element, index) => {
          if (guess === element.answer && !res) { 
            // no need for splice as it will skip an entry
            res = "That wasn't that hard, I bet you don't get the next one.";
          };
        })
        return res;
      }
    }
    
    
    const response = new Sphinx();
    response.collectRiddle({"answer":"short"});
    console.log(response.attemptAnswer('short'));
        2
  •  0
  •   Taki    1 年前

    你从不打电话 collectRiddle 所以 this.riddles 总是 [] 以及 forEach 块从未输入,因此不返回任何内容,因此返回值为 undefined

    您应该有一个名为 found 在循环之前,如果找到匹配项,请将其设置为 true 然后返回字符串,具体取决于 建立 变量:

    注意:函数中的字符串与您要比较的字符串不同(它有反斜杠,以点结尾),因此测试总是不稳定的。

    class Sphinx {
      constructor() {
        this.name = null;
        this.riddles = [];
      }
      collectRiddle(riddle) {
        this.riddles.push(riddle);
        if (this.riddles.length > 3) {
          this.riddles.shift()
        };
      }
      attemptAnswer(guess) {
        var found = false;
        this.riddles.forEach((element, index) => {
    
          if (guess === element.answer) {
            found = true;
          }
        })
        return found ? "Woohoo" : "That wasn't that hard, I bet you don't get the next one."
      }
    }
    
    //test
    const s = new Sphinx();
    const response = s.attemptAnswer('short');
    
    console.log(response === `That wasn't that hard, I bet you don't get the next one.`);
        3
  •  0
  •   Aytacworld    1 年前

    我想你已经做到了 const sphynx = new Sphynx() .

    attemptAnswer() 不返回任何内容,在javascript中,如果不返回任何内容,则基本上返回 undefined . 所以响应是未定义的,这是正常的。

    在你的情况下,我会用 for循环 而不是 前额 .

    attemptAnswer(guess) {
      for (let i = 0; i < this.riddles.length; i++) {
        if (guess === this.riddles[i].answer) {
          this.riddles.splice(index, 1);
          return "That wasn't that hard, I bet you don't get the next one.";
        }
      }
      return "Not found";
    }
    

    使用 .splice() 不建议在前臂内侧

    使用foreach,将遍历数组中的所有项,即使您已经找到了答案。