我正在进行FreeCodeCamp Mutations挑战。这就是我要做的事情:
如果数组的第一个元素中的字符串包含,则返回true 数组第二个元素中字符串的所有字母。
例如,[" hello"," Hello"]应该返回true,因为所有的 第二个字符串中的字母出现在第一个字母中,忽略大小写。
参数["你好","嘿"]应该返回false,因为字符串 "你好"不包含" y"。
最后,[" Alien"," line"]应该返回true,因为所有的 " line"中的字母出现在" Alien"。
这是我的解决方案。不幸的是它不起作用,虽然我认为可以解决这样的问题。我的错误在哪里?
以下是我的详细评论代码:
JSON.parse(jsonBody.playersAndRoles);
出于某种原因function mutation(arr) {
//indexOf is case sensitive, so first we make all the elements in the array lowerCase. After that we use the lowerCaseArray instead of our original array
var y = arr.join(" ");
var x = y.toLowerCase();
var lowerCaseArray = x.split(" ")
// This variable will contain the number of matches
var matchCounter = 0;
//The for loop picks a letter from the second element
//(lowerCaseArray[1][i]) of an array and then we look
//if a match in the first element of an array(lowerCaseArray[0] is found).
//If there is a match, then the indexOf would return a number >=0.
//In this case we add 1 to our matchCounter.
for (i = 0; i < lowerCaseArray[1].length; i++) {
if(lowerCaseArray[0].indexOf(lowerCaseArray[1][i]) > 0) {
matchCounter+= 1;
}
//Finally we compare the matchCounter length with the second
//element of our array. If matchCounter >= the length of our
//array, it means every letter in the second element was found
//within the first element
}
return matchCounter >= arr[1].length;
}
mutation(["floor", "for"]);
返回&#39; o&#39;,尽管第二个元素的最后一个字母是&#34; r&#34;。在给定的示例中,return lowerCaseArray[1][i];
等于2,但它应该是3,因为有3个匹配。也许这是错误的部分。
答案 0 :(得分:2)
您需要检查不等-1
,因为零0
是字符串的有效索引。
if (lowerCaseArray[0].indexOf(lowerCaseArray[1][i]) !== -1) {
// ^^^^^^
function mutation(arr) {
var y = arr.join(" "),
x = y.toLowerCase(),
lowerCaseArray = x.split(" "),
matchCounter = 0,
i;
for (i = 0; i < lowerCaseArray[1].length; i++) {
if (lowerCaseArray[0].indexOf(lowerCaseArray[1][i]) !== -1) {
matchCounter += 1;
}
}
return matchCounter >= arr[1].length;
}
console.log(mutation(["floor", "for"]));
&#13;
答案 1 :(得分:1)
导致代码返回错误结果的行是:
if (lowerCaseArray[0].indexOf(lowerCaseArray[1][i]) > 0) {
它忽略了所寻找的角色可能处于0位置的可能性。
将>
更改为>=
可使其正常运行。您的评论实际上表明它应该是>=
,但您的代码使用>
。
还有一些其他地方可以使代码稍微复杂一点。见下文:
function mutation(arr) {
//indexOf is case sensitive, so first we make all the elements in the array lowerCase. After that we use the lowerCaseArray instead of our original array
var lowerCaseArray = arr.map(function (str) {
return str.toLowerCase();
});
// the for loop checks each letter in the second string
// if any of its letters is not present in the first one,
// return false immediately
for (i = 0; i < lowerCaseArray[1].length; i++) {
if (lowerCaseArray[0].indexOf(lowerCaseArray[1][i]) === -1) {
return false;
}
}
// if the for loop completed without returning, then the strings pass the test.
return true;
}
console.log(mutation(["floor", "for"]));
&#13;
答案 2 :(得分:0)
if(lowerCaseArray[0].indexOf(lowerCaseArray[1][i]) > -1)?
答案 3 :(得分:0)
或者,您也可以使用regex
。这也将为您节省匹配案例的麻烦。
<强>示例强>
function validate(arr){
var regex_str = arr[0].replace(/[^a-z0-9 ]/gi, function(m){ return "\\" + m })
var regex = new RegExp("^[" + regex_str + "]*$", "i");
var valid = regex.test(arr[1]);
console.log(regex, "|", arr[1], "|", valid)
return valid
}
validate(["floor", "for"])
validate(["floor", "fora"])
validate(["heworld", "hello World "])
validate(["heworld", "hello World "])
validate(["heworldts(*) ", "hello World (test *)"])
&#13;
答案 4 :(得分:0)
尝试一次匹配(&#39; sIng&#39;,&#39;歌手&#39;)。
var match=function(a,b)
{
var nomatch=0;
var w1=a.toLowerCase();
var word1=w1.split('');
var string2=b.toLowerCase();
console.log('word1 len : '+word1.length+' '+string2+' length : '+string2.length);
for(var i=0;i<word1.length;i++)
{
if(string2.indexOf(word1[i])==-1)
{
console.log('no match : '+b+' .indexOf('+word1[i]+')');
nomatch +=1;
}
else
{
console.log('match : '+b+'.indexOf('+word1[i]+')');
}
}
if(nomatch>0)
{
console.log(b+' does not have all characters of '+a);
}
else
{
console.log(b+' do have all characters of '+a);
}
}
match('hello','Hell');