使用indexOf在两个数组中查找匹配项

时间:2017-02-24 11:10:14

标签: javascript arrays

我正在进行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个匹配。也许这是错误的部分。

5 个答案:

答案 0 :(得分:2)

您需要检查不等-1,因为零0是字符串的有效索引。

if (lowerCaseArray[0].indexOf(lowerCaseArray[1][i]) !== -1) {
//                                                  ^^^^^^

&#13;
&#13;
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;
&#13;
&#13;

答案 1 :(得分:1)

导致代码返回错误结果的行是:

if (lowerCaseArray[0].indexOf(lowerCaseArray[1][i]) > 0) {

它忽略了所寻找的角色可能处于0位置的可能性。

>更改为>=可使其正常运行。您的评论实际上表明它应该是>=,但您的代码使用>

还有一些其他地方可以使代码稍微复杂一点。见下文:

&#13;
&#13;
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;
&#13;
&#13;

答案 2 :(得分:0)

if(lowerCaseArray[0].indexOf(lowerCaseArray[1][i]) > -1)?

答案 3 :(得分:0)

或者,您也可以使用regex。这也将为您节省匹配案例的麻烦。

<强>示例

&#13;
&#13;
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;
&#13;
&#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');