通过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()
返回介于0
和letter.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的主要内容,如果未能解决你的问题,请参考以下文章
计算字符串中的重复符号并使用Javascript对它们进行分组
QML和C++混合编程中,在qml中向C++的char* 函数传递一个char*的字符串参数,qml不能识别char*的参数类型