array.includes 方法不计算大写字母

array.includes method not counting uppercase letters

我写了一个程序来验证一个随机字符串是否是一个 pangram(包含所有字母表的字母),我将作为函数参数的字符串转换为一个数组,然后我检查了字母按字母排序,并将找到的每个新字母放入一个新数组中,并将计数器加 1。如果计数器等于 26,则函数 returns 为真,否则为 returns 假。但似乎使用的 Array.includes 方法不计算大写字母,出于某种原因,我认为它会计算同一个字母两次,因为它以小写和大写形式出现。有人可以帮我吗? 我的代码如下:

function pangram (string){
  let alphabet =
    ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
     'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
  let arrayString = Array.from(string);
  let counterArray = [];
  let counter = 0;
  
  for(let i = 0; i <= arrayString.length-1; i++){
    for(let j = 0; j <= alphabet.length-1; j++){
      if(arrayString[i] === alphabet[j]){
          if(counterArray.includes(arrayString[i])){
              counter;
          } else {
              counterArray.push(arrayString[i]);
              counter++;
          }
      }
    }
  }
  
  if(counter ===  26){
    return true;
  } else {
    return counter;
  }
}

您可以先将字符转为小写

if(counterArray.includes(arrayString[i].toLowerCase())){
    // your logic here
}

感谢@PRSHL 的代码修改建议。

你可以在把字符串转成数组之前做

const arrayString = [...string.toLowerCase()];

我还建议您解决整个问题。希望对你有所帮助。

function pangram(string) {
  const alphabet =
    ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
      'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
  const newStr = [
          ...new Set(
            string.toLowerCase()
            .split('')
            .filter(l => l!=' ')
            .sort()
          )
        ];
  return JSON.stringify(newStr) === JSON.stringify(alphabet) || newStr.length;
}

备注

这个解决方案也适用于句子。

说明

如您所见,我在分配 newStr 变量时使用了方法链接,这部分可能会造成混淆。所以让我们分解它:

  • string.ToLowerCase() - 当我们比较需要小写的单词时

  • .split - 这里我们开始链接方法。我们将 returned 字符串(来自 string.ToLowerCase() )拆分成一个数组。这等于:

    让 str1 = str.toLowerCase();

    str1 = str1.split();

  • .filter(l => l != ' ') - 遍历数组中的每个字母(将其标记为 l )和 return 只有不为空的字母 space。过滤 return 个数组。

  • .sort - 对 returned 数组进行排序。

  • new Set() - returned数组,我们用它作为集合object.Set 对象是只能出现一次的值的集合。我们创建这个对象,所以我们只有唯一的字母[=7​​4=]

  • [...] - 使用展开语法,我们将集合对象展开到一个数组中。我们需要它作为一个数组,以便我们可以将它与字母[=7​​4=]

    进行比较

return部分

我们不能用 == 或 === 比较两个数组,因为相等运算符将检查数组是否是相同的实例(仅 arr1 === arr1 )。因此,我们需要一种解决方法。我选择对它们进行字符串化,但您可以通过多种方式实现。

return JSON.stringify(newStr) === JSON.stringify(alphabet) || newStr.length;

因此,如果 newStr 等于字母表,我们 return 为真,否则我们 return 计算 newStr 的长度。

改进

每个问题都有很多解决方案,每一个都可以改进。 在这种特殊情况下,我会说在比较之前,我们可以检查数组的长度是否相同。如果它们不是,我们只是 return 长度。 注意:避免嵌套三元运算符

return newStr.length != alphabet.length ? newStr.length :
  JSON.stringify(newStr) === JSON.stringify(alphabet) ? true : newStr.length;