【问题标题】:Why does this code receive an error in test cases in codewars? [duplicate]为什么这段代码在 codewars 的测试用例中会收到错误? [复制]
【发布时间】:2021-09-05 06:39:23
【问题描述】:

我不知道为什么,但我在运行以下代码时总是收到错误消息:

function list(names) {
  let str = '';
  if (!names) {
    return ''
  } else if (names.length == 2) {
    return names[0].name + ' & ' + names[1].name;
  } else if (names.length == 1) {
    return names[0].name;
  } else {
    for (i = 0; i < (names.length - 2); i++) {
      str += names[i].name + ', ';
    }

    str += names[names.length - 2].name + ' & ' + names[names.length - 1].name;
    return str;
  }
}

codewars kata 中有测试用例。 错误是:

TypeError: Cannot read property 'name' of undefined
    at list
    at /home/codewarrior/index.js:36:19
    at /runner/frameworks/javascript/cw-2.js:152:11
    at Promise._execute

names 应该是一个可以为空的数组,并且数组元素是具有名称属性的对象。

【问题讨论】:

  • 它甚至会在哪里抛出该错误?输入是什么?
  • 与 python 不同,在 javascript 中空数组是真实的,所以if(!names) 不是检查空列表的正确方法。
  • 如果 names.length 为 0 怎么办。也检查一下。
  • 是测试用例,我加代码
  • 是的,现在我明白了。 @georg 和 Tushar Shafi 是正确的。谢谢 ! ??????

标签: javascript arrays typeerror


【解决方案1】:

作为替代解决方案,您可以使用 maplastIndexOfslice

你必须遇到2个极端情况:

1) 一个长度为零的输入数组 那么你必须将return空字符串作为

 if (!names.length) return "";

2) 长度为 1 的输入数组,然后您只需将名称返回为:

if (names.length === 1) return names[0].name;

function list(names) {
  if (!names.length) return "";
  if (names.length === 1) return names[0].name;
  const namesStr = names.map((o) => o.name).join(", ");
  const index = namesStr.lastIndexOf(",");
  const result = namesStr.slice(0, index) + " &" + namesStr.slice(index + 1);
  return result;
}

const result = list([{ name: "Bart" }, { name: "Lisa" }, { name: "Maggie" }]);
console.log(result);

【讨论】:

    【解决方案2】:

    kata 提到您应该为空数组返回一个空字符串。我想你打算这样做

    if (!names) {
        return ''
      }
    

    ...但是一个空数组仍然是真实的。也许那行应该是if (!names.length)

    【讨论】:

    • 顺便说一句,在评估中使用严格比较被认为是 javascript 中的最佳实践,例如 .length === 1,因为例如 true == 1 是真的
    猜你喜欢
    • 2021-09-05
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    相关资源
    最近更新 更多