这个挑战的描述是取一个字符串并用从1索引开始的字母表中的字母位置替换字母。要求您跳过所有非字符,包括空格。
function alphabetPosition(text) {
var result = [];
var 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"]
text = text.replace(/\W*\d+/g, '').toLowerCase().split('');
for (var i = 0; i < text.length; i++)
result.push(alphabet.indexOf(text[i]) + 1);
return result.join(' ');
}
我的问题是,当涉及到随机测试时,输入将包含数字和非单词字符,但正则表达式并不认识它。输入为n8_ovuu&
,输出/错误为Expected: '14 15 22 21 21', instead got: '14 0 15 22 21 21 0'
问题在于正则表达式,但我无法弄明白。如果您有任何想法我会很感激帮助!
答案 0 :(得分:8)
在循环中添加条件:
替换:
for (var i = 0; i < text.length; i++)
result.push(alphabet.indexOf(text[i]) + 1);
使用:
for (var i = 0; i < text.length; i++) {
var j = alphabet.indexOf(text[i]) + 1;
if (j) result.push(j);
}
请注意,您可以将字母表定义为字符串而不是数组,而不对上述循环进行任何更改:
var alphabet = 'abcdefghijklmnopqrstuvwxyz';
这是一个ES6代码解决方案,它使用方法链接方法,以一个return
语句返回结果:
function alphabetPosition(text) {
return text.toLowerCase().split('')
.filter( c => c >= 'a' & c <= 'z' )
.map( c => c.charCodeAt(0) - 'a'.charCodeAt(0) + 1)
.join(' ');
}
console.log(alphabetPosition('n8_ovuu&'));
function alphabetPosition(text) {
return text.toLowerCase().replace(/[^a-z]/g, '')
.replace(/./g, ([c]) => ' ' + (c.charCodeAt(0) - 'a'.charCodeAt(0) + 1))
.substr(1);
}
console.log(alphabetPosition('n8_ovuu&'));
答案 1 :(得分:1)
您获得了零,因为某些字符(例如_
和&
)与字母表不匹配。如果.indexOf()
无法找到匹配项,则会返回-1
。然后,您将+ 1
添加到其中,使其为零。
您可以将这些字符添加到字母表中,也可以通过简单地添加if
子句来忽略这些字符。
for (var i = 0; i < text.length; i++) {
var index = alphabet.indexOf(text[i]);
if (index > -1) {
result.push(index + 1);
}
}
要告诉您的正则表达式过滤非字母字符,请将\W
替换为明确的反转字符范围[^a-zA-Z]
。
console.log("abc_def".replace(/[^a-zA-Z]/, ''));
&#13;
答案 2 :(得分:1)
嘿,这对我有用。
const alphabetPosition = (text) => {
// First isolate the characters in the string using split method, and then map them.
const result = text.split('').map(a => parseInt(a, 36) - 9)
.filter(a => a >= +1).join(' ')
console.log(result)
}
alphabetPosition(text)
答案 3 :(得分:0)
您可以使用对象作为字母的索引。如果没有人是fount,请采用默认值。
function alphabetPosition(text) {
var 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"],
object = {};
alphabet.forEach(function (a, i) {
object[a] = i + 1;
});
return text.replace(/\W*\d+/g, '').toLowerCase().split('').map(function (a) {
return object[a] || 0;
}).join(' ');
}
console.log(alphabetPosition('n8_ovuu&'));
&#13;
答案 4 :(得分:0)
这很有效,而且非常简洁:
const data = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"£$%^&*()';
const result = data.toLowerCase().match(/[a-z]/g).map(c => c.charCodeAt(0) - 96).join(' ');
console.log(result);
&#13;