Я хотел бы предупредить каждую отдельную букву строки, но я не уверен, как это сделать.
Итак, если у меня есть:
var str = 'This is my string';
Я хотел бы иметь возможность отдельно предупреждать T, h, i, s и т. Д. Это только начало идеи, над которой я работаю, но мне нужно знать, как обрабатывать каждое письмо отдельно.
Я хочу использовать jQuery и подумал, что мне может понадобиться использовать функцию split после проверки длины строки.
Идеи?
javascript
jquery
string
Ник Хаббард
источник
источник
for(const c of str) { ... }
. Более подробно об этом ниже в довольно подробном, но недостаточно голосуемом ответе. PS: ссылка @ ARJUN не работает для меня.Ответы:
Если порядок оповещений имеет значение, используйте это:
Если порядок оповещений не имеет значения, используйте это:
Показать фрагмент кода
источник
[]
IE для получения символа в определенной позиции не поддерживается в IE <9charAt
осталось от дней UCS-2, когда не было суррогатных пар, и для решения проблемыcodepointAt
была добавлена новая функция в JavaScript, которая корректно обрабатывает нашу дружественную кучу пу. Я верю, что у Java это тоже есть.Это, вероятно, более чем решено. Просто хочу внести свой вклад с другим простым решением:
источник
[...text].forEach(console.log)
forEach()
передает индекс и массив как второй и третий аргумент. Я бы предпочел не регистрировать это ..for (let c of [...text]) { console.log(c) }
let c of text
уже делает работуОдно из возможных решений в чистом JavaScript:
источник
Как обрабатывать каждую букву текста (с тестами)
https://jsperf.com/str-for-in-of-foreach-map-2за
Классический и, безусловно, самый эффективный . Вы должны пойти с этим, если вы планируете использовать его в алгоритме, критичном к производительности, или если он требует максимальной совместимости с версиями браузера.
для ... из
for ... of - это новый ES6 для итератора. Поддерживается большинством современных браузеров. Это визуально более привлекательно и менее склонно к опечаткам. Если вы собираетесь использовать его в производственном приложении, вы, вероятно, должны использовать транспортер, такой как Babel .
для каждого
Функциональный подход. Airbnb утвержден . Самым большим недостатком этого способа является
split()
создание нового массива для хранения каждой отдельной буквы строки.или
Вот те, которые мне не нравятся.
для ... в
В отличие от ... вы получаете буквенный индекс вместо буквы. Это работает довольно плохо.
карта
Функциональный подход, что хорошо. Однако карта не предназначена для этого. Его следует использовать, когда нужно изменить значения внутри массива, что не так.
или
источник
for
цикл фактически был вторым самым медленным, хотяfor...of
был самым быстрым (примерно в три раза быстрееfor
).for
цикл немного быстрее.Большинство, если не все ответы здесь неправильны, потому что они ломаются всякий раз, когда в строке за пределами Unicode BMP (Basic Multilingual Plane) есть символ . Это означает, что все эмодзи будут сломаны .
JavaScript использует UTF- 16 Unicode для всех строк. В UTF-16 символы за пределами BMP состоят из двух частей, называемых « суррогатная пара », и большинство ответов здесь будут обрабатывать каждую часть таких пар отдельно, а не как один символ.
Одним из способов в современном JavaScript, начиная с 2016 года, является использование нового итератора String . Вот пример (почти) прямо из MDN:
источник
Вы можете попробовать это
источник
Еще одно решение ...
источник
for..of
for (let ch of t) { alert(ch) }
Когда мне нужно написать короткий код или однострочник, я использую этот «хак»:
Это не будет считать переводы строк, так что это может быть хорошо или плохо. Если вы хотите включить новые строки, замените:
/./
на/[\S\s]/
. Вероятно, вы можете использовать другие однострочники, у.split()
которых много проблемисточник
forEach
функцию вызова, по сравнению с отправленными параметрамиreplace
. Если я знаю, что я ASCIIing, я думаю, у меня все еще есть некоторые варианты использования дляsplit
. Отличный ответ, хотя!u
флага вместе сg
флагом? ОК, только что проверил, и я был прав.Новый JS позволяет это:
источник
Из-за разного размера байта лучше использовать оператор for ... of, если строка содержит символы Юникода.
источник
краткий ответ:
Array.from(string)
даст вам то, что вы, вероятно, хотите, а затем вы можете повторить на нем или что-то еще, так как это просто массив.хорошо давайте попробуем с этой строкой:
abc|⚫️\n⚪️|👨👩👧👧
.кодовые точки:
поэтому некоторые символы имеют одну кодовую точку (байт), а некоторые - две или более, и добавлена новая строка для дополнительного тестирования.
поэтому после тестирования есть два способа:
источник
Теперь вы можете перебирать отдельные кодовые точки Unicode, содержащиеся в строке, используя
String.prototype[@@iterator]
, который возвращает значение общеизвестного типа SymbolSymbol.iterator
- итератор по умолчанию для объектов типа массива (String
в данном случае).Пример кода:
Это работает с символами Юникода, такими как смайлики или нелатинские символы, которые могут запутать устаревшие конструкции.
Ссылка: MDN Ссылка на String.prototype @@ iterator .
источник
for ... of
цикла и над строкой - это синтаксический сахар для доступа к итератору.Теперь вы можете использовать в ключевом слове.
источник
in
является законной частью языка. Используйте вещи соответствующим образом. Ваша статья предупреждает, чтоin
буквенные клавиши интерпретируются так же, как цифровые клавиши. Так? Может быть, это то, что вы хотите. Можно также сказать, что другие методы неправильно игнорируют альфа-ключи. Имо,of
имеет правильное поведение. В массивах JS элементы без буквенных ключей все еще имеют ключи: числовые. В моей консоли JS "правильно" обрабатывает альфа-клавишу так же, как и цифровые клавиши:>const arr = ['a', 'b'] >arr.test = 'hello' >arr 0: "a" 1: "b" test: "hello" length: 2
Вы можете получить массив отдельных символов, как так
а затем цикл с использованием обычного Javascript, иначе вы можете перебирать символы строки, используя jQuery:
источник
Вы можете преобразовать эту строку в массив символов с помощью
split()
, а затем выполнить итерацию по ней.источник
Если вы хотите выполнить преобразование текста на уровне символов и вернуть преобразованный текст в конце, вы должны сделать что-то вроде этого:
Итак, шаги:
источник
В сегодняшнем JavaScript вы можете
Array.prototype.map.call('This is my string', (c) => c+c)
Очевидно, c + c представляет то, что вы хотите сделать с c.
Это возвращает
["TT", "hh", "ii", "ss", " ", "ii", "ss", " ", "mm", "yy", " ", "ss", "tt", "rr", "ii", "nn", "gg"]
источник
[...'This is my string'].map((c)=>c+c)
Это должно работать в старых браузерах и с символами UTF-16, такими как 💩.
Это должно быть наиболее совместимым решением. Однако он менее производительный, чем
for
цикл.Я создал регулярное выражение с помощью regexpu
Надеюсь это поможет!
источник
Вы можете получить доступ к отдельным символам с помощью
str.charAt(index)
илиstr[index]
. Но последний путь не является частью ECMAScript, поэтому вам лучше пойти с первым.источник
Если вы хотите анимировать каждый символ, вам может понадобиться обернуть его в элемент span;
Я думаю, что это лучший способ сделать это, а затем обработать пролеты. (например, с TweenMax)
TweenMax.staggerFromTo ($ demoText.find ("span"), 0,2, {autoAlpha: 0}, {autoAlpha: 1}, 0,1);
источник
Попробуйте этот код
источник