通过char javascript遍历字符串char

Posted

技术标签:

【中文标题】通过char javascript遍历字符串char【英文标题】:traverse a string char by char javascript 【发布时间】: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?

【问题讨论】:

【参考方案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();

【讨论】:

以上是关于通过char javascript遍历字符串char的主要内容,如果未能解决你的问题,请参考以下文章

转数组

将字符串中的字符反转输出

如何通过带有指针的函数传递 char 变量(示例已发送)?

java中如何将char数组转化为String?

计算字符串中的重复符号并使用Javascript对它们进行分组

QML和C++混合编程中,在qml中向C++的char* 函数传递一个char*的字符串参数,qml不能识别char*的参数类型