function SimpleSymbols(str) {
var letter =['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'];
var newstr = "";
for (var i = 0; i<str.length; i++){
if (str.charAt(i).toLowerCase() in letter){
newstr += "M";
}
else{
newstr += "X";
}
}
return newstr;
}
如果str是“Argument goes here”,则返回XXXXXXXXX。为什么不返回MMMMMMMMMM?
答案 0 :(得分:7)
您没有在in
的数组中查找条目。使用indexOf()
查找数组条目的位置。 indexOf()
将返回该位置,如果未找到任何条目,则返回-1
。
for (var i = 0; i<str.length; i++){
var strChar = str.charAt(i).toLowerCase();
if ( letter.indexOf(strChar) >= 0 ) {
newstr += "M";
}
…
答案 1 :(得分:3)
如果对象具有名称的属性,而不是值,则in
operator会返回true
。
数组基本上是一个具有数字属性的对象。即索引是对象的属性名称。它基本上是这样的:
var letters = {
0: 'a',
1: 'b',
...
length: ...
};
因此,在您的情况下,如果true
返回str.charAt(i).toLowerCase()
和0
之间的数字,那么条件将只有letter.length
(因为charAt
只返回一个字符,它只能是0-9
)。
示例:
> var letters = ['a', 'b', 'c'];
> 'a' in letters // array doesn't have a property 'a'
false
> 0 in letters // array has a property 0 (it's the first element)
true
因此,"Argument goes here"
不包含任何数字,in
条件始终为false
,这就是为什么XXXXXX...
为in
结果
查看问题&#34; How do I check if an array includes an object in JavaScript?&#34;用于测试数组中元素的存在。
FWIW,要使var letters = {
'a': true,
'b': true,
// ...
};
运算符起作用,您必须创建一个表单对象:
{{1}}
但写起来有点麻烦。
答案 2 :(得分:0)
请允许我提供侧视图,另一种方式是使用正则表达式处理我认为您打算做的事情:
"test2".replace(/[a-z]/gi,"M").replace(/[^M]/g,"X") //Outputs "MMMMX"
String.replace
将替换包含来自[a-z]
的字母的字符串,表达式末尾的i
表示不区分大小写。 g表示将搜索所有可能的匹配,而不仅仅是第一个匹配。在第二个表达式[^M]
中,^
表示否定,因此任何非M
的内容都将替换为X
。
还有另一种方法可以使用正则表达式在String.replace
中实现自定义函数,它可以像这样实现:
"test2".replace(/([a-z])|([^a-z])/gi,
function(m,g1, g2){
return g1 ? "M" : "X";
});
在正则表达式中,括号创建组和|表示或在此表达式([a-z])|([^a-z])
中有2个组,其中一个字母来自az,另一个表示不是a-z
的所有内容,只有组g1
如果它是组,我们只需要替换函数1是M
,否则是X
。
你可以做的另一个很酷的事情是通过原型化将这个函数添加到你的所有字符串中:
String.prototype.traverse = function(){ return this.replace(/([a-z])|([^a-z])/gi,function(m,g1){ return g1 ? "M" : "X" });}
然后它可以像:"test1".traverse();