再次成为JavaScript的新手,并从Ruby / Python过来,所以我觉得JS
是一个很好的面孔,但我仍然致力于掌握它。我想将所有vowels
替换为vowels.toUpperCase()
。
示例1
我尝试使用map
,但我无法理解如何传递当前迭代的索引:
function vowelToUpCase(idx){
if(vowel.test(new_arr[idx])) {
new_arr[idx] = new_arr[idx].toUpperCase();
}
}
new_arr.map(vowelToUpCase(idx));
new_arr.join('');
示例2
无论如何,我认为这可以通过一些简单的str
在regex
上轻松完成,我认为错了,因为我坚持你在下面看到的内容。
var new_arr = [ 'e', 'i', 'f', 'm', 'e', 'm', 'p', '*', '3' ];
var vowel = /[aeiou]/gi;
var str = new_arr.join('');
console.log(str);
str.replace(/([aeiou])/gi, function (match) {
var str = match.toUpperCase();
console.log(str);
});
console.log(str);
输出:
eifmemp*3
E
I
E
eifmemp*3
期望的输出:
EIfmEmp*3
问题:
map()
函数吗?str.replace
示例有什么问题?答案 0 :(得分:4)
两个基本问题:
.replace()
没有替换字符串,它会返回一个新值(所以我们需要str = str.replace();
替换回调函数需要成功替换返回值。
最终代码:
str = str.replace(/([aeiou])/g, function (match) {
return match.toUpperCase();
});
console.log(str);
// EIfmEmp*3
注意:我从正则表达式中删除了i
修饰符,因为任何大写字母都已经是大写的。这样可以在非常次要范围内保存性能(因为我们赢了E.toUpperCase();
,因为它已经是大写的。)
要解决@ mplungjan的评论,no..regex在替换中无法做任何逻辑。它可以引用事物并用静态内容替换匹配。但是,匹配的任何修改都需要使用您选择的语言的回调函数来完成。我们可以进行5次单独的替换调用:
str = str.replace(/a/g, 'A');
str = str.replace(/e/g, 'E');
str = str.replace(/i/g, 'I');
str = str.replace(/o/g, 'O');
str = str.replace(/u/g, 'U');
console.log(str);
// EIfmEmp*3
虽然5 simple replacements更快,但我更喜欢代码可读性;)
答案 1 :(得分:1)
对于您的地图问题:
var new_arr = [ 'e', 'i', 'f', 'm', 'e', 'm', 'p', '*', '3' ];
function vowelToUpCase(value, index, originalArray) {
if(/[aeiou]/.test(value)) {
return value.toUpperCase();
}
return value;
}
var fixed = new_arr.map(vowelToUpCase); // adding params here is bad
console.log(fixed.join(""));
答案 2 :(得分:0)
这是一个有效的例子: CodePen
希望这有帮助。
答案 3 :(得分:0)
以下是自定义过滤器的另一个示例。
var array = [ 'e', 'i', 'f', 'm', 'e', 'm', 'p', '3','h','e','l','l','o'];
var result = []
array.forEach(function (e) {
/[aeiouAEIOU]/.test(e) ? '' : result.push(e);
})
console.log(result)