【问题标题】:traverse a string char by char javascript通过char javascript遍历字符串char
【发布时间】:2014-10-18 20:19:21
【问题描述】:
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?

【问题讨论】:

    标签: javascript charat


    【解决方案1】:

    您不会在带有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";
        }
    …
    

    【讨论】:

    • 如果你现在可以解释你的答案?
    • @FelixKling var 为什么?你什么意思?
    • 这正是我刚刚发布代码时的想法。
    • 现在对你有意义吗?
    【解决方案2】:

    in operator 返回true,如果对象具有具有该名称,而不是具有该 的属性。

    数组基本上是具有数字属性的对象。 IE。 indexes 是对象的属性名称。基本上是这样的:

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

    因此,在您的情况下,如果str.charAt(i).toLowerCase() 返回介于0letter.length 之间的数字,则条件将仅为true(并且由于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... 的原因。

    请参阅问题“How do I check if an array includes an object in JavaScript?”以测试数组中元素的存在。


    FWIW,要使 in 运算符工作,您必须创建一个形式为:

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

    但是写起来有点麻烦。

    【讨论】:

    • 所以我应该使用 .contains?
    • 没有包含。
    • @dreamlab:我从没说过有。
    • 我知道你没有。但@mikeandike 不明白。
    • 顺便说一句,投反对票,如果我的回答有任何问题,请告诉我,我很乐意纠正。
    【解决方案3】:

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

    "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();

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 2021-11-12
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多