【问题标题】:JS Array.every alway return false on comparing stringsJS Array.every 在比较字符串时总是返回 false
【发布时间】:2018-05-18 16:32:35
【问题描述】:

我正在尝试使用every 来完成一项任务,我尝试了所有方法,1 小时后我决定寻求你的帮助。

如果数组中的所有单词都以不区分大小写开头,则此函数应返回 true,但无论如何始终返回 false。

谢谢

var allStartingWithA = function(words){
  return words.length !== 0? words.every((word) => {word[0] === /"a"/i }) : true;
};

allStartingWithA(["abbb","aee", "aee", "avvv"]);

【问题讨论】:

  • word[0]string,但您将它与 RegExp 进行比较,结果总是 false

标签: javascript arrays methods


【解决方案1】:

问题是你没有从回调中返回任何东西。

使用箭头函数的匿名函数可以写成

() = > expression

() => { function body; }

方法1默认返回表达式的值,方法2默认返回undefined

由于您使用的是第二种方法,您将不得不手动返回值或切换到第一种方法。


代码中的另一个问题是表达式。当您必须使用正则表达式进行测试时,您应该使用方法test

所以你的表达应该是/^a/i.test(word)

如果你只想比较第一个字符,你可以word[0] === "a",但这会区分大小写。


另一个优化可以是,因为如果数组为空,您想返回true,您可以返回一个表达式,其计算结果为:

  • 数组应为空白或所有单词都应以某些字符开头。

所以你的最终代码是:

var allStartingWithA = function(words) {
  return words.length === 0 || words.every((word) => /a/i.test(word));
};

console.log(allStartingWithA([]));
console.log(allStartingWithA(["abbb", "aee", "aee", "avvv"]));
console.log(allStartingWithA(["bbb", "aee", "aee", "avvv"]));

参考资料:

【讨论】:

  • 好吧word[0]可以改成word[0].toLowerCase()
  • 这是一种方法。我个人更喜欢正则表达式。
【解决方案2】:

之前有人发布过这个然后删除它,我喜欢这个解决方案,谢谢你。

var allStartingWithA = function(words){
  return words.length !== 0? words.every(word => word[0].toLowerCase()=='a') : true;
};
console.log(allStartingWithA(["abbb","aee", "aee", "avvv"]));

【讨论】:

【解决方案3】:
  1. 如果长度为 0,为什么要返回 true?您应该返回 false。
  2. 如果要使用正则表达式,最好使用 match() 或 test()。或者您可以只使用 .toLowerCase()。
  3. 在测试您的代码时,请使用不同的方案来确保您的代码正常工作。 ["abbb","aee", "aee", "avvv"] 总是会返回 true。尝试添加以 A 开头或以其他字母开头的字符串,以测试您的函数是否也会返回 false。

var allStartingWithA = function(words){
  return words.length !== 0? words.every((word) => word[0].toLowerCase() == 'a' ) : false;
};

allStartingWithA(["abbb","aee", "aee", "avvv"]);
allStartingWithA(["Abbb","aee", "aee", "avvv"]);
allStartingWithA(["notStartingWithA","aee", "aee", "avvv"]);

【讨论】:

  • 1.如果数组为空,我需要返回 true,这是一个赋值情况。 2.我习惯小写
  • @Marco 您应该更新您的问题以澄清这些极端情况。
【解决方案4】:

您的方法对于该问题是正确的。而您在箭头函数的使用和正则表达式的使用方面犯了一些小错误

首先(word) => {word[0] === /"a"/i } 函数不返回任何内容

你可以使用

(word) => {return word[0] === /"a"/i }(word) => word[0] === /"a"/i

其次,您只是在进行比较。然后如果你添加//i它会变成正则表达式那么你需要使用test方法。

所以使用return word[0] === "a"只是为了比较

var allStartingWithA = function(words){
  return words.length !== 0? words.every((word) => word[0] === "a") : true;
};

console.log(allStartingWithA(["abbb","aee", "aee", "avvv"]));

【讨论】:

    猜你喜欢
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 2016-12-18
    相关资源
    最近更新 更多