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 的巧妙结合