for (i = 0; i < objects.length; i++)
for (i = 0; i < charsToFind.length; i++)
TO ...
for (var i = 0; i < objects.length; i++)
for (var i = 0; i < charsToFind.length; i++)
ИЛИ ...
for (let i = 0; i < objects.length; i++)
for (let i = 0; i < charsToFind.length; i++)
Примечание о поддержке браузера: в IE 11 "пусть переменные не связаны отдельнона каждую итерацию цикла for " Caniuse - let .
В настоящее время вы объявляете i
в обоих циклах for
без идентификатора var, let, const
, поэтомуприсваивается тому же свойству i
в глобальном объекте , а не объявляется новой переменной локальной области.Цикл for
внутри simplifyString (string)
присваивает новое значение тому же i
, что и первый for
цикл, и все портит.
* Как уже упоминалось в комментариях, это то, как выможно использовать reduce()
, чтобы сделать ваш код более читабельным, минимизировать ненужные побочные эффекты / мутации и соединить ваш tests
напрямую с их заменой values
, чтобы избежать путаницы ...
var charReplacements = [
{ test: /[áàâãä]/g, value: 'a' },
{ test: /[éèêë]/g, value: 'e' },
{ test: /[íìîï]/g, value: 'i' },
{ test: /[óòôõö]/g, value: 'o' },
{ test: /[úùûü]/g, value: 'u' },
{ test: /ç/g, value: 'c' },
{ test: /[- \'&_]/g, value: '' }
];
function simplifyString (string) {
return charReplacements
.reduce((str, {test, value}) =>
str.replace(test, value)
, string);
}
ПРИМЕЧАНИЕ. Если вы работаете с большими наборами данных, я бы спросил кого-нибудь умнее меня, как сделать это с несколькими строками регулярных выражений, что будет гораздо эффективнее, чем перебирать заменители