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 对象是只能出现一次的值的集合。我们创建这个对象,所以我们只有唯一的字母[=74=]
[...] - 使用展开语法,我们将集合对象展开到一个数组中。我们需要它作为一个数组,以便我们可以将它与字母[=74=]
进行比较
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;
我写了一个程序来验证一个随机字符串是否是一个 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 对象是只能出现一次的值的集合。我们创建这个对象,所以我们只有唯一的字母[=74=]
[...] - 使用展开语法,我们将集合对象展开到一个数组中。我们需要它作为一个数组,以便我们可以将它与字母[=74=]
进行比较
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;