如何使用Javascript处理每个文本字母?

我想提醒字符串的每个字母,但我不确定如何做到这一点。

如果我有:

var str = 'This is my string';

我想能够单独提醒This等。这只是我正在研究的一个想法的开始,但我需要知道如何分别处理每个字母。

我在想,我可能需要在测试字符串的长度后使用分割函数。

我该怎么做呢?

815355 次浏览

纯javascript的一个可能的解决方案:

for (var x = 0; x < str.length; x++)
{
var c = str.charAt(x);
alert(c);
}

你可以用str.charAt(index)str[index]代替访问单个字符。但是后一种方式不是ECMAScript的一部分,所以你最好使用前一种方式。

你可以试试这个

var arrValues = 'This is my string'.split('');
// Loop over each value in the array.
$.each(arrValues, function (intIndex, objValue) {
alert(objValue);
})

你可以像这样得到一个由单个字符组成的数组

var test = "test string",
characters = test.split('');

然后循环使用常规Javascript,否则你可以迭代字符串的字符使用jQuery by

var test = "test string";


$(test.split('')).each(function (index,character) {
alert(character);
});

如果提醒的顺序很重要,使用这个:

for (var i = 0; i < str.length; i++) {
alert(str.charAt(i));
}

或者这个:(也可以看到这个答案)

 for (var i = 0; i < str.length; i++) {
alert(str[i]);
}

如果提醒的顺序不重要,使用这个:

var i = str.length;
while (i--) {
alert(str.charAt(i));
}

或者这个:(也可以看到这个答案)

 var i = str.length;
while (i--) {
alert(str[i]);
}

var str = 'This is my string';


function matters() {
for (var i = 0; i < str.length; i++) {
alert(str.charAt(i));
}
}


function dontmatter() {
var i = str.length;
while (i--) {
alert(str.charAt(i));
}
}
<p>If the order of alerts matters, use <a href="#" onclick="matters()">this</a>.</p>


<p>If the order of alerts doesn't matter, use <a href="#" onclick="dontmatter()">this</a>.</p>

如果你想动画每个字符,你可能需要用span元素来包装它;

var $demoText = $("#demo-text");
$demoText.html( $demoText.html().replace(/./g, "<span>$&amp;</span>").replace(/\s/g, " "));

我认为这是最好的方法,然后处理张成的空间。(例如TweenMax)

TweenMax。staggerFromTo($demoText.find("span"), 0.2, {autoAlpha:0}, {autoAlpha:1}, 0.1);

可能不止是解决了。只是想提供另一个简单的解决方案:

var text = 'uololooo';


// With ES6
[...text].forEach(c => console.log(c))


// With the `of` operator
for (const c of text) {
console.log(c)
}


// With ES5
for (var x = 0, c=''; c = text.charAt(x); x++) {
console.log(c);
}


// ES5 without the for loop:
text.split('').forEach(function(c) {
console.log(c);
});

还有一个解决方案……

var strg= 'This is my string';
for(indx in strg){
alert(strg[indx]);
}

当我需要写短代码或一行代码时,我使用这个“hack”:

'Hello World'.replace(/./g, function (char) {
alert(char);
return char; // this is optional
});

它不会计算换行,这可能是好事,也可能是坏事。如果你想包含换行符,用/[\S\s]/替换:/./。您可能看到的其他一行程序可能使用.split()有很多问题

现在可以使用关键字。

.
    var s = 'Alien';
for (var c in s) alert(s[c]);

最好使用for…的语句,如果字符串包含unicode字符,因为字节大小不同。

for(var c of "tree 木") { console.log(c); }
//"𝐀A".length === 3

这里的大多数答案(如果不是全部的话)都是错误的,因为只要字符串在Unicode BMP(基本多语言平面)之外中有一个字符,它们就会中断。也就是所有的表情符号都将被破坏

JavaScript对所有字符串使用UTF -16 Unicode。在UTF-16中,BMP以外的字符由两个部分组成,称为“代理 一对”,这里的大多数答案将单独处理这些对的每个部分,而不是作为单个字符处理。

至少从2016年开始,现代JavaScript的一种方法是使用新的字符串迭代器。下面是一个来自MDN的例子:

var string = 'A\uD835\uDC68B\uD835\uDC69C\uD835\uDC6A';


for (var v of string) {
alert(v);
}
// "A"
// "\uD835\uDC68"
// "B"
// "\uD835\uDC69"
// "C"
// "\uD835\uDC6A"

试试这段代码

    function myFunction() {
var text =(document.getElementById("htext").value);
var meow = " <p> <,> </p>";
var i;




for (i = 0; i < 9000; i++) {


text+=text[i] ;






}


document.getElementById("demo2").innerHTML = text;


}
</script>
<p>Enter your text: <input type="text" id="htext"/>


<button onclick="myFunction();">click on me</button>
</p>

如果你想在字符级别上对文本进行转换,并在结束时获得转换后的文本,你会这样做:

var value = "alma";
var new_value = [...value].map((x) => x+"E").join("")

步骤如下:

  • 分裂将字符串转换为字符数组(列表)
  • 通过函子映射每个字符
  • 将生成的字符数组连接到生成的字符串中

注意:如果您需要性能,可能有更好、更优化的解决方案。我把这个作为一个干净的代码风格的方法发布。

如何处理每个文本字母(使用基准测试)

https://jsperf.com/str-for-in-of-foreach-map-2

经典大多数性能。如果您计划在性能关键算法中使用它,或者它需要与浏览器版本的最大兼容性,那么应该使用它。

for (var i = 0; i < str.length; i++) {
console.info(str[i]);
}

的……

的……是迭代器的新ES6。大多数现代浏览器都支持。它在视觉上更有吸引力,也不容易出现打字错误。如果您打算在生产应用程序中使用这种编译器,那么您可能应该使用巴别塔这样的编译器。

let result = '';
for (let letter of str) {
result += letter;
}

forEach

# EYZ1方法。# EYZ2。这样做的最大缺点是split(),它创建了一个新数组来存储字符串的每个字母。

< p >为什么?这就强制执行了我们的不可变规则。处理纯函数 返回值比副作用更容易理解。

// ES6 version.
let result = '';
str.split('').forEach(letter => {
result += letter;
});

var result = '';
str.split('').forEach(function(letter) {
result += letter;
});

以下是我不喜欢的。

对…

不像……的,你得到的是字母索引而不是字母本身。它的表现非常糟糕。

var result = '';
for (var letterIndex in str) {
result += str[letterIndex];
}

地图

函数方法,很好。然而,地图并不是用来做这个的。当需要更改数组中的值时,应该使用它,但实际情况并非如此。

// ES6 version.
var result = '';
str.split('').map(letter => {
result += letter;
});

let result = '';
str.split('').map(function(letter) {
result += letter;
});

在今天的JavaScript中,你可以

< p > <代码> Array.prototype.map。call('This is my string', (c) =>c + c) < /代码> < / p >

显然,c+c表示你想用c做的任何事情。

这将返回

< p > <代码>[“TT”、“hh”、“二世”,“党卫军 ", " ", " 二世”、“党卫军”、“”, “毫米”、“yy ", " ", " 党卫军”、“tt”、“农达”、“二”、“神经网络”、“gg”)< /代码> < / p >

New JS允许这样做:

const str = 'This is my string';
Array.from(str).forEach(alert);

这应该是适用于旧浏览器和UTF-16字符如💩。

这应该是最兼容的解决方案。但是,它的性能不如for循环。

我使用regexpu生成正则表达式

var str = 'My String 💩 ';
var regEx = /(?:[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g




str.replace(regEx, function (char) {
console.log(char)
});

希望这能有所帮助!

简单的回答:Array.from(string)将给你你可能想要的,然后你可以迭代它或其他,因为它只是一个数组。

好的,让我们用这个字符串abc|⚫️\n⚪️|👨‍👩‍👧‍👧试试。

codepoints是:

97
98
99
124
9899, 65039
10
9898, 65039
124
128104, 8205, 128105, 8205, 128103, 8205, 128103

因此,有些字符有一个码位(字节),有些字符有两个或更多,并添加换行符用于额外的测试。

所以经过测试有两种方法:

  • 每个字节(每个码点)
  • 字符组(但不是整个家族的表情)

string = "abc|⚫️\n⚪️|👨‍👩‍👧‍👧"


console.log({ 'string': string }) // abc|⚫️\n⚪️|👨‍👩‍👧‍👧
console.log({ 'string.length': string.length }) // 21


for (let i = 0; i < string.length; i += 1) {
console.log({ 'string[i]': string[i] }) // byte per byte
console.log({ 'string.charAt(i)': string.charAt(i) }) // byte per byte
}


for (let char of string) {
console.log({ 'for char of string': char }) // character groups
}


for (let char in string) {
console.log({ 'for char in string': char }) // index of byte per byte
}


string.replace(/./g, (char) => {
console.log({ 'string.replace(/./g, ...)': char }) // byte per byte
});


string.replace(/[\S\s]/g, (char) => {
console.log({ 'string.replace(/[\S\s]/g, ...)': char }) // byte per byte
});


[...string].forEach((char) => {
console.log({ "[...string].forEach": char }) // character groups
})


string.split('').forEach((char) => {
console.log({ "string.split('').forEach": char }) // byte per byte
})


Array.from(string).forEach((char) => {
console.log({ "Array.from(string).forEach": char }) // character groups
})


Array.prototype.map.call(string, (char) => {
console.log({ "Array.prototype.map.call(string, ...)": char }) // byte per byte
})


var regexp = /(?:[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g


string.replace(regexp, (char) => {
console.log({ 'str.replace(regexp, ...)': char }) // character groups
});

现在可以使用String.prototype[@@iterator]遍历字符串中包含的单个Unicode代码点,它返回一个众所周知的符号类型Symbol.iterator的值——类数组对象的默认迭代器(在本例中为String)。

示例代码:

const str = 'The quick red 🦊 jumped over the lazy 🐶! 太棒了!';


let iterator = str[Symbol.iterator]();
let theChar = iterator.next();


while(!theChar.done) {
console.log(theChar.value);
theChar = iterator.next();
}


// logs every unicode character as expected into the console.

这适用于Unicode字符,如emoji或非罗马字符,这些字符会绊倒遗留结构。

参考:# EYZ0。

你可以使用split()将这个字符串转换成一个字符数组,然后遍历它。

const str = "javascript";
const strArray = str.split('');


strArray.map(s => console.log(s));

你可以简单地在数组中迭代它:

for(var i in txt){
console.log(txt[i]);
}

// There are multiple ways but I find this easiest.


let str = 'This is my string';
for(let character of str)
console.log(character)