9
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; 

}

If str is "Argument goes here" it returns XXXXXXXXX. WHy doesn't it return MMMMMMMMMM?

4

3 回答 3

10

您不用 . 在数组中查找条目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";
    }
…
于 2014-08-25T16:12:24.973 回答
4

如果对象具有具有该名称而不具有该值的属性,则in运算符返回。true

数组基本上是具有数字属性的对象。即索引是对象的属性名称。它基本上看起来像这样:

var letters = {
  0: 'a',
  1: 'b',
  ...
  length: ...
};

因此,在您的情况下,条件仅是true返回andstr.charAt(i).toLowerCase()之间的数字(并且由于仅返回一个字符,因此只能是)。0letter.lengthcharAt0-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...结果的原因。

请参阅问题“如何检查数组是否包含 JavaScript 中的对象? ”以测试数组中元素的存在。


FWIW,要使in操作员工作,您必须创建一个形式的对象:

var letters = {
  'a': true,
  'b': true,
  // ...
};

但是写起来有点麻烦。

于 2014-08-25T16:15:24.583 回答
0

请允许我提供一个侧视图,另一种处理我认为您打算通过使用正则表达式来执行的操作,例如:

"test2".replace(/[a-z]/gi,"M").replace(/[^M]/g,"X") //Outputs "MMMMX"

String.replace将替换包含来自表达式末尾的字母的字符串,[a-z]表示i不区分大小写。g 表示将搜索所有可能的匹配项,而不仅仅是第一个匹配项。在第二个表达式中,[^M]^意味着否定,因此任何不是 an 的M都将被替换为X

还有另一种方法可以在String.replaceusing 正则表达式中实现自定义函数,它可以像这样实现:

"test2".replace(/([a-z])|([^a-z])/gi,
     function(m,g1, g2){ 
            return g1 ? "M" : "X";  
     });

在正则表达式中,括号创建组和 | 表示或在此表达式([a-z])|([^a-z])中,有 2 个组,一个带有来自 az 的字母,另一个表示不具有替换功能的所有内容,如果它是第 1组,a-z我们只要求 group是一个.g1MX

您可以做的另一件很酷的事情是将此函数添加到您的所有字符串中,方法是对其进行原型设计,如下所示:

String.prototype.traverse = function(){ return this.replace(/([a-z])|([^a-z])/gi,function(m,g1){ return g1 ? "M" : "X"  });}

然后它可以像这样简单地使用:"test1".traverse();

于 2014-08-25T18:30:29.947 回答