在检查匹配字母的单词中循环使用 indexOf 时出现问题

Trouble Using indexOf While Looping Through a Word Checking for Matching Letters

请帮我想清楚...我正在尝试检查数组第二个元素中的所有字母是否都包含在第一个元素的字母中,忽略大小写。所以 "Aliens" 和 "lines" 应该 return 为真,因为 "lines" 中的所有字母都包含在 "Aliens" 中,即使它们没有按顺序排列。我的问题是,当我尝试遍历第一个元素时,我的代码似乎只检查第一个字母是否匹配,而不是继续遍历整个单词。

function mutation(arr) {
  var firstElement = arr[0].toLowerCase().split('');
  var secondElement = arr[1].toLowerCase().split('');
  for (var i = 0; i < firstElement.length; i++) {
    return firstElement.indexOf(secondElement[i]) != -1;
  }
}
mutation(["hello", "neo"]);

有什么想法吗?

不要拆分第一个元素 -- 将其视为字符串并使用 indexOf 方法处理第二个元素中的单个字符。

更新 -- 是的,就像下面 Depperm 的代码一样,但是在 firstElement 上抛出一个 toLowerCase。

使用 Paul Kienitz 提到的方法,还可以将循环更改为遍历第二个元素,以检查第一个元素中的每个字符,看看它是否在第一个元素中找到该字符。

function mutation(arr) {
  var firstElement = arr[0];
  var secondElement = arr[1].toLowerCase().split('');
  var match=true;
  var temp;
  for (var i = 0; i < secondElement.length; i++) {
    temp = firstElement.indexOf(secondElement[i]);
    if(temp==-1)
      match=false;
  }
  return match;
}
mutation(["hello", "neo"]);

函数有两个问题:

首先,正如你所说,它只检查了第一个字母就返回了。

其次,您需要使用第二个元素的长度作为循环终止条件,因为这是您要循环的字母。

你还需要这样的东西:

function mutation(arr) {
  var firstElement = arr[0].toLowerCase().split('');
  var secondElement = arr[1].toLowerCase().split('');
  for (var i = 0; i < secondElement.length; i++) {
     if(firstElement.indexOf(secondElement[i]) === -1) {
         return true;
     }
  }
  return false;
}

您可能还想处理一些明显的边界情况,例如 null/undefined/empty 字符串,但为了清楚起见,我将其省略。

它只检查第一个字母,因为当它进入循环时,return语句被执行,因此函数终止。

function mutation(arr) {
  var firstElement = arr[0];
  var secondElement = arr[1];
  return secondElement.split('').every(function(elem) {return  firstElement.indexOf(elem) != -1;} );
}
mutation(["Aliens", "lines"]);

您可以使用 mapreduce 来节省代码行数

function mutation(arr) {
  var secondElement = arr[1].toLowerCase().split('');
  var map = secondElement.map(function(a){return arr[0].indexOf(a) != -1});
  return map.reduce(function(a,b) {return a&&b;}, true);
}

在第二行检查第二个单词的每个字母是否在第一个单词中(并保存 true/false)。第三行只是将这些结果累加到最终变量中

参考 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Array/reduce https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Array/map