Замена «-» на «_» использованием цикла в javascript

Я применил тот же метод для замены «-» на «_» в c ++, и он работает правильно, но в javascript он не заменяет вообще.

function replace(str)
{
    for(var i=0;i<str.length;i++)
    {
        if(str.charAt(i)=="-")
        {
            str.charAt(i) = "_";
        }
    }
    return str;
}

javascript,

1

Ответов: 3


4

Это достаточно просто в javascript, на самом деле не стоит делать новую функцию:

function replace(str){
  return str.replace(/-/g, '_') // uses regular expression with 'g' flag for 'global'
}

console.log(replace("hello-this-is-a-string"))

Однако это не изменяет исходную строку, потому что строки в javascript неизменяемы.

Если вы мертвы, чтобы избежать встроенного (возможно, вы хотите выполнить более сложную обработку), reduce()может быть полезно:

function replace(str){
  return [...str].reduce((s, letter) => s += letter == '-' ? '_' : letter , '')
}

console.log(replace("hello-this-is-a-string"))


1

Вы можете легко заменить полную строку, используя .split () и .join ().

function replace(str){
  return str.split("-").join("_");
}

console.log(replace("hello-this-is-a-string"))


0

Это еще один случай «убедитесь, что вы прочитали сообщение об ошибке». В случае

str.charAt(i) = "_";

правильное описание того, что происходит, не «не заменяет вообще», как вы бы это сделали; это «он генерирует ошибку JavaScript во время выполнения», который в Chrome сформулирован как

Uncaught ReferenceError: Invalid left-hand side in assignment

В Firefox это

ReferenceError: invalid assignment left-hand side

Это должно было дать вам ключ, необходимый для отслеживания вашей проблемы.

Повторяю: внимательно прочитайте сообщения об ошибках . Затем прочитайте их снова и снова. В подавляющем большинстве случаев они точно сообщают вам, в чем проблема (если вы только потратили время, чтобы попытаться понять их), или, по крайней мере, указать вам в правильном направлении.

Конечно, чтение сообщения об ошибке предполагает, что вы знаете, как просмотреть сообщение об ошибке. Вы? В большинстве браузеров доступно окно инструментов разработки - часто через - F12который содержит «консоль», отображая сообщения об ошибках. Если вы не знаете о devtools или консоли, убедитесь, что вы их понимаете, прежде чем писать одну строку кода.

Или вы могли бы просто обыскать Stack Overflow, поскольку (почти) все вопросы уже заданы там, особенно от новичков. Например, я искал в Google для

могу ли я использовать charat в javascript для замены символа в строке?

и первым результатом было: Как заменить символ в конкретном индексе в JavaScript? , который имеет более 400 upvotes, как и первый и принятый ответ, который гласит:

В JavaScript строки неизменяемы, что означает, что лучше всего вы можете создать новую строку с измененным контентом и назначить переменную для указания на нее.

Когда вы научитесь программировать или изучать новые языки, вы неизбежно столкнетесь с вещами, которые вы не знаете, или вещами, которые вас путают. Что делать? Отправка на переполнение стека почти всегда является наихудшей альтернативой. В конце концов, как вы знаете, это не учебный сайт, и это не справочный сайт, и это не форум. Это вопросы и ответы на интересные вопросы программирования.

В лучшем случае вы получите snarky комментарии и ответы, которые испортят ваш день; в худшем случае вы будете голосовать и проголосовать, что не просто смущает, но может помешать вам задавать вопросы в будущем. Так как вы хотите , чтобы убедиться , что вы в состоянии задавать вопросы , когда вам действительно нужно, то лучше с принимать гораздо больше времени проводят исследования, в том числе Google и SO поиска, на простые вопросы новичка перед публикацией. Или найдите форум, который призван помочь новым людям. Или попросите человека рядом с вами, если он есть. Или выполните одно или несколько учебников.

Но зачем вообще писать?

Однако, если вы не работаете над этой проблемой как способом обучения себя JavaScript, в качестве своего рода тренировки, нет никаких оснований писать его вообще. Он уже был написан сотни или, возможно, тысячи раз в истории вычислений. И подавляющее большинство этих реализаций будут лучше, быстрее, чище, менее глючными и более функциональными, чем все, что вы напишете. Таким образом, ваша работа как «программист» заключается не в том, чтобы писать что-то, что превращает тире в символы подчеркивания; это найти и использовать что-то, что делает.

Как сказал мудрец, сегодня мы больше не пишем алгоритмов; мы объединяем вызовы API. Наша задача - найти и понять API для вызова.

Найти API совсем не сложно с Google. В этом случае было бы полезно, если бы вы знали, что строки с подчеркиваниями иногда называются «змеиными», но даже не зная, что вы можете найти что-то на первой странице результатов Google с таким запросом, как «javascript convert string to использование библиотеки подчеркивания ".

Самый первый результат и тот, на который вы должны обратить внимание, - это underscore.string , набор строковых утилит, написанных в духе универсальной библиотеки «подчеркивания» и предназначенных для использования с ней. Он предоставляет API-интерфейс underscored. В дополнение к работе с «dasherized» input (ваш случай), он также обрабатывает другие форматы строк / идентификаторов, такие как «camelCase».

Даже если вы не хотите импортировать эту конкретную библиотеку и использовать ее (что вам, вероятно, и нужно), вам будет намного лучше украсть или клонировать ее код , который в упрощенной форме:

str
  .replace(/([a-zd])([A-Z]+)/g, '$1_$2')
  .replace(/[-s]+/g, '_')

Это не так сложно, как кажется. Первая часть - дело с входом camelCase, так что "catsAndDogs«становится, "cats-and-dogs"вторая строка - это то, что обрабатывает тире и пробелы»). Посмотрите внимательно - он заменяет прогоны нескольких тире с помощью одного подчеркивания. Это может быть легко что-то, что вы хотите также, в зависимости от того, кто делает то, что с преобразованной строкой вниз по течению. Это прекрасный пример того, что кто-то другой, пишущий библиотеку профессионального уровня для этой задачи, думал о том, что вы не можете писать свое доморощенное решение.

Обратите внимание, что эта хорошо расцененная, точно перевернутая библиотека не использует split/joinтрюк, чтобы делать глобальные замены в строках, как предлагает другой ответ. Этот подход вышел из употребления почти десять лет назад.

Кроме того, чтобы сэкономить на себе трудность написать его самостоятельно, и в конечном итоге с лучшим кодом, если у вас есть время, чтобы понять, что он делает, вы также получите больше информации о регулярных выражениях.

JavaScript,
Похожие вопросы