【问题标题】:array.includes method not counting uppercase lettersarray.includes 方法不计算大写字母
【发布时间】:2021-10-22 20:09:24
【问题描述】:

我写了一个程序来验证一个随机字符串是否是一个 pangram(包含所有字母),我将作为函数参数的字符串转换为一个数组,然后我逐个字母检查并将找到的每个新字母放入一个新数组中,并在计数器上加 1。如果计数器等于 26,则函数返回 true,否则返回 false。但似乎使用的 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;
  }
}

【问题讨论】:

  • 什么大写字母?
  • 那么当你传入大写字母时,预期的结果是什么?
  • 哦,是的,没错,字母数组不包含任何大写字母。好的,谢谢你的回复,我是新来的,我得注意这样的事情。

标签: javascript arrays uppercase lowercase


【解决方案1】:

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

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 - 在这里我们开始链接方法。返回的字符串(来自 string.ToLowerCase() )我们将其拆分为一个数组。这等于:

    让 str1 = str.toLowerCase();

    str1 = str1.split();

  • .filter(l => l != ' ') - 遍历数组中的每个字母(将其标记为 l )并仅返回非空格的字母。过滤器返回一个数组。

  • .sort - 对返回的数组进行排序。

  • new Set() - 返回的数组,我们将它用作 set 对象的参数。Set 对象是只能出现一次的值的集合。我们创建了这个对象,所以我们只有唯一的字母

  • [...] - 使用扩展语法,我们将集合对象扩展为一个数组。我们需要它作为一个数组,以便我们可以将它与字母表进行比较

返回部分

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

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

所以如果 newStr 等于字母我们返回 true,否则我们返回 newStr 的长度。

改进

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

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

【讨论】:

  • 这就是我所做的,我将整个字符串转换为小写字符串,然后将其传递给数组。但是你的解决方案比我的更干净。无论如何,谢谢你的反馈,你帮了我很多,我正在学习 JS,很高兴看到其他人解决同样的问题。
【解决方案2】:

可以先将字符转为小写

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

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

【讨论】:

  • 是的,谢谢,我改变了我的代码,想法是一样的,但我将所有字符串转换为小写,然后再将它传递给arrayString。感谢您帮助我,我仍在研究我的逻辑:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 2020-01-04
  • 2021-01-25
  • 2013-08-10
  • 2020-08-28
  • 1970-01-01
相关资源
最近更新 更多