JS Array.every 在比较字符串时总是返回 false

Posted

技术标签:

【中文标题】JS Array.every 在比较字符串时总是返回 false【英文标题】:JS Array.every alway return false on comparing strings 【发布时间】: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 【参考方案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"]));

参考资料:

string.charAt(x) or string[x]? Use dynamic (variable) string as regex pattern in javascript Arrow functions - MDN

【讨论】:

好吧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"]));

【讨论】:

这是您要感谢的人的个人资料链接:***.com/users/4964923/jaydip-jadhav【参考方案3】:
    如果长度为 0,为什么要返回 true?您应该返回 false。 如果要使用正则表达式,最好使用 match() 或 test()。或者您可以只使用 .toLowerCase()。 在测试您的代码时,请使用不同的方案来确保您的代码正常工作。 ["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"]));

【讨论】:

以上是关于JS Array.every 在比较字符串时总是返回 false的主要内容,如果未能解决你的问题,请参考以下文章

Array.every 函数并未在 Object 的所有元素上运行

for循环,forin循环和Array.every(),obj.forEach()方法运行速度对比

巧技拾遗 | JavaScript 中 Array.every 和 Array.map 的巧妙结合

JS ECMAScript 5中的every 和 some方法进行逻辑判断

写好 JS 条件语句的 5 条守则--摘自前端大学

javascript Array.some()和Array.every()