如何迭代包含单个字符串的 JavaScript 数组?
How Can I Iterate over JavaScript array containing single character strings?
我正在尝试解决 JavaScript 中应该是相对容易的练习题。目标是创建一个名为 shiftLetters()
的函数,它执行以下操作:
- 将作为参数传递的字符串转换为由字符串中的单个字母组成的字符串数组。
- 使用
Array.prototype.map()
方法遍历数组中的每个字符。
- 如果字符是 space,则不应进行转换。
- 如果字符是字母数字,则应使用
String.charCodeAt()
向前移动一个字符进行转换(例如,F 变为 G,f 变为 g)。
- 使用
String.fromCharCode()
、assemble 字符串,例如 'I cannot tell a lie' 转换为 'J dboopu ufmm b mjf.'
到目前为止,这是我的代码:
var shiftLetters = function(string){
// 1. Convert string to an array of characters.
const stringArray = string.split('');
const mappedString = stringArray.map( (char) => {
for (char in mappedString) {
// TO BE DONE
}
});
}
const example = 'Able was I ere I saw Elba.';
我发现上述代码存在以下问题,但我不确定如何解决它们:
- 尽管字符串(在此示例中为 'Able was I ere I saw Elba.')已成功转换为由单个字符组成的数组,例如
['A', 'b', 'l', 'e'...]
、String.prototype.charCodeAt()
和 String.fromCharCode()
不是数组公开的方法,不能在该上下文中使用。
- 在 MDN 和其他在线资源的搜索中,我无法发现任何可以引用数组中的索引并获取该元素的 ASCII 字符代码的方法。
虽然我可以看到,如果我 did 成功地创建了一个转换后的字符数组,那么使用 ```Array.prototype.join() 将是一件简单的事情`` 创建以上述方式转换的字符串。我只是无法弄清楚如何达到这一点。
如果能提供任何见解,我将不胜感激。与此同时,我将继续我的研究。如果我找到答案,我会post在这里。
在此先感谢您的帮助。
此致,
罗伯特·希格
您不需要 map
中的 for 循环:您已经在迭代 StringArray 中的字符。由于字符是字符串,因此您可以对它们使用所有字符串方法。在这种情况下,您需要 String.fromCharCode
和 String.charCodeAt
.
var shiftLetters = function(string){
// 1. Convert string to an array of characters.
const stringArray = string.split('');
const transformedStringArray = stringArray.map( (char) => {
if (/[A-Za-z0-9]/.test(char)){
return String.fromCharCode(char.charCodeAt() + 1);
}
else {
return char;
}
})
return transformedStringArray.join('');
}
获取字符码,加一得到新字符。
const
shiftLetters = string => string
.split('')
.map(c => c === ' ' || !/[a-z\d]/i.test(c)
? c
: String.fromCharCode(c.charCodeAt(0) + 1))
.join(''),
example = 'Able was I ere I saw Elba.';
console.log(shiftLetters(example));
这几乎是最简洁的,而且不太难理解
var shiftLetters = string => (
string.split('').map( c => (
String.fromCharCode( c.charCodeAt(0) + !!c.match(/[A-Za-z\d]/) )
)).join("")
);
请注意,我使用的是隐式 returns,因此缺少显式 return 语句。这个解决方案中最棘手的部分是行
c.charCodeAt(0) + !!c.match(/[A-Za-z\d]/)
在此,我们检查 c 是否为具有 match
的纯字母数字字符。如果是,match
将 return 一个 Match
对象,否则我们得到 null。然后,!!
会将 truthy/falsey(Match Obj vs. Null)值转换为布尔值。最后,当对 JavaScript 中的布尔值进行算术运算时,false = 0 和 true = 1。因此该语句会将每个字母数字字符映射到下一个字符,并将所有其他字符映射到它们自己。
我正在尝试解决 JavaScript 中应该是相对容易的练习题。目标是创建一个名为 shiftLetters()
的函数,它执行以下操作:
- 将作为参数传递的字符串转换为由字符串中的单个字母组成的字符串数组。
- 使用
Array.prototype.map()
方法遍历数组中的每个字符。 - 如果字符是 space,则不应进行转换。
- 如果字符是字母数字,则应使用
String.charCodeAt()
向前移动一个字符进行转换(例如,F 变为 G,f 变为 g)。 - 使用
String.fromCharCode()
、assemble 字符串,例如 'I cannot tell a lie' 转换为 'J dboopu ufmm b mjf.'
到目前为止,这是我的代码:
var shiftLetters = function(string){
// 1. Convert string to an array of characters.
const stringArray = string.split('');
const mappedString = stringArray.map( (char) => {
for (char in mappedString) {
// TO BE DONE
}
});
}
const example = 'Able was I ere I saw Elba.';
我发现上述代码存在以下问题,但我不确定如何解决它们:
- 尽管字符串(在此示例中为 'Able was I ere I saw Elba.')已成功转换为由单个字符组成的数组,例如
['A', 'b', 'l', 'e'...]
、String.prototype.charCodeAt()
和String.fromCharCode()
不是数组公开的方法,不能在该上下文中使用。 - 在 MDN 和其他在线资源的搜索中,我无法发现任何可以引用数组中的索引并获取该元素的 ASCII 字符代码的方法。
虽然我可以看到,如果我 did 成功地创建了一个转换后的字符数组,那么使用 ```Array.prototype.join() 将是一件简单的事情`` 创建以上述方式转换的字符串。我只是无法弄清楚如何达到这一点。
如果能提供任何见解,我将不胜感激。与此同时,我将继续我的研究。如果我找到答案,我会post在这里。
在此先感谢您的帮助。
此致,
罗伯特·希格
您不需要 map
中的 for 循环:您已经在迭代 StringArray 中的字符。由于字符是字符串,因此您可以对它们使用所有字符串方法。在这种情况下,您需要 String.fromCharCode
和 String.charCodeAt
.
var shiftLetters = function(string){
// 1. Convert string to an array of characters.
const stringArray = string.split('');
const transformedStringArray = stringArray.map( (char) => {
if (/[A-Za-z0-9]/.test(char)){
return String.fromCharCode(char.charCodeAt() + 1);
}
else {
return char;
}
})
return transformedStringArray.join('');
}
获取字符码,加一得到新字符。
const
shiftLetters = string => string
.split('')
.map(c => c === ' ' || !/[a-z\d]/i.test(c)
? c
: String.fromCharCode(c.charCodeAt(0) + 1))
.join(''),
example = 'Able was I ere I saw Elba.';
console.log(shiftLetters(example));
这几乎是最简洁的,而且不太难理解
var shiftLetters = string => (
string.split('').map( c => (
String.fromCharCode( c.charCodeAt(0) + !!c.match(/[A-Za-z\d]/) )
)).join("")
);
请注意,我使用的是隐式 returns,因此缺少显式 return 语句。这个解决方案中最棘手的部分是行
c.charCodeAt(0) + !!c.match(/[A-Za-z\d]/)
在此,我们检查 c 是否为具有 match
的纯字母数字字符。如果是,match
将 return 一个 Match
对象,否则我们得到 null。然后,!!
会将 truthy/falsey(Match Obj vs. Null)值转换为布尔值。最后,当对 JavaScript 中的布尔值进行算术运算时,false = 0 和 true = 1。因此该语句会将每个字母数字字符映射到下一个字符,并将所有其他字符映射到它们自己。