2015-08-18 2 views
2
var name = "AlbERt EINstEiN"; 

function nameChanger(oldName) { 
var finalName = oldName; 
// Your code goes here! 
finalName = oldName.toLowerCase(); 

finalName = finalName.replace(finalName.charAt(0), finalName.charAt(0).toUpperCase()); 

for(i = 0; i < finalName.length; i++) { 
    if (finalName.charAt(i) === " ") 
     finalName.replace(finalName.charAt(i+1), finalName.charAt(i+1).toUpperCase()); 
} 


// Don't delete this line! 
return finalName; 
}; 

// Did your code work? The line below will tell you! 
console.log(nameChanger(name)); 

Мой код как есть, возвращает «Альберт эйнштейн». Мне интересно, где я ошибся? Если добавить вОбозначить первую букву каждого слова

console.log(finalName.charAt(i+1)); 

ПОСЛЕ, если заявление и закомментируйте остальное, он печатает «е», так что он признает charAt(i+1), как он должен ... Я просто не могу получить его, чтобы извлечь выгоду, что первую букву второе слово.

ответ

4

В вашем примере кода есть две проблемы. Я пройду через них один за другим.

Строки неизменны

Это не работает так, как вы думаете, что делает:

finalName.replace(finalName.charAt(i+1), finalName.charAt(i+1).toUpperCase()); 

Вы должны изменить его на:

finalName = finalName.replace(finalName.charAt(i+1), finalName.charAt(i+1).toUpperCase()); 

В JavaScript, строки неизменный. Это означает, что после создания строки она не может быть изменена. Это может показаться странным, поскольку в вашем коде кажется, что вы меняете строку finalName по всему циклу с помощью методов, таких как replace().

Но на самом деле вы на самом деле его не меняете! Функция replace() принимает входную строку, выполняет ли замена, а создает новую строку вывода, так как на самом деле не разрешается изменять входную строку (неизменность). Итак, tl; dr, если вы не фиксируете вывод replace(), назначив его переменной, замещенная строка будет потеряна.

Кстати, это нормально, чтобы вернуть его к исходному имени переменной, поэтому вы можете сделать finalName = finalName.replace(...).


Заменить жаден

Другая проблема, которую вы будете работать в, когда вы используете replace(), вы будете заменять все символов соответствия в строке, а не только те, на позиции, которую вы изучаете. Это потому, что replace() жадный - если вы скажете ему заменить «e» на «E», он заменит их все!

Что вам нужно сделать, по существу, является:

  1. Найти пробел (вы уже сделали это)
  2. захватить все строки до и включая пространство; эта «сторона» строки хороша.
  3. Преобразуйте самую следующую букву в верхний регистр, но только эту букву.
  4. Захват остальной части строки, письмо, которое вы преобразовали.
  5. Поместите все три части вместе (начало строки, заглавная буква, конец строки).

Метод slice() будет делать то, что вы хотите:

if (finalName.charAt(i) === " ") { 
    // Get ONLY the letter after the space 
    var startLetter = finalName.slice(i+1, i+2); 
    // Concatenate the string up to the letter + the letter uppercased + the rest of the string 
    finalName = finalName.slice(0, i+1) + startLetter.toUpperCase() + finalName.slice(i+2); 
} 

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

Рабочая jsfiddle: http://jsfiddle.net/9dLw1Lfx/

Дальнейшее чтение:

+1

... Так? Вы должны хотя бы объяснить, почему это изменение необходимо, тем более, что этот вопрос кажется домашним заданием. – xdumaine

+0

Я пробовал это, и он возвращает «AlbErt einstein». Не совсем уверен, почему он захватывает первое «е», а не одно за пространством? – JoshTheGray

+0

@xdumaine Я согласен, я был в середине расширения объяснения, когда вы прокомментировали :) –

-4
if (finalName.charAt(i) === " ") 

Если не было бы

if (finalName.charAt(i) == " ") 

Не проверяет, равны ли типы объектов, которые не должны быть, поскольку один из них является символом, а другой - строкой.

+0

Вы уверены, что charAt (i) возвращает строку, а не символ? –

+0

Это ** не **, отвечая на вопрос любым способом. * И * это неправильно, так как в JavaScript нет типа 'char', charAt' просто возвращает строку длиной 1. – Darkhogg

+0

CharAt должен быть символом, а« "должен быть строкой. Но поскольку это javascript, не помню, если «==» »из-за слабого набора текста. –

4

Вы можете упростить это вниз много, если вы передаете RegExp/pattern/flags и функцию в str.replace вместо использования подстрок

function nameChanger(oldName) { 
    var lowerCase = oldName.toLowerCase(), 
     titleCase = lowerCase.replace(/\b./g, function ($0) {return $0.toUpperCase()}); 
    return titleCase; 
}; 

В этом примере я применил изменения к любому символу . после word boundary \b, но вы можете уточнить /(^|)./g

+0

Это довольно загадочно, особенно для новичков. – xdumaine

+0

@ xdumaine Какая часть конкретно? Я попытался прояснить это, разделив его на три строки. Я редактировал в некоторых ссылках –

+0

Я сомневаюсь, что OP распознает этот синтаксис замены, означает, что он использует регулярные выражения, не говоря уже о том, как вы придумали эти регулярные выражения или что они означают. Это довольно продвинутое решение проблемы с «твоим кодом здесь». – xdumaine

1

Еще один хороший ответ на этот вопрос - использовать RegEx для этого.

var re = /(\b[a-z](?!\s))/g; 
var s = "fort collins, croton-on-hudson, harper's ferry, coeur d'alene, o'fallon"; 
s = s.replace(re, function(x){return x.toUpperCase();}); 
console.log(s); // "Fort Collins, Croton-On-Hudson, Harper's Ferry, Coeur D'Alene, O'Fallon" 

Регулярное выражение используется, возможно, придется изменить немного вверх, но это должно дать вам представление о том, что вы можете сделать с регулярными выражениями

Capitalize Letters with JavaScript

1

Проблема двояка:

1) Вам нужно вернуть значение для finalName.replace, поскольку метод возвращает элемент, но не изменяет тот, на котором он задан.

2) Вы не повторяете значения строк, поэтому вы меняете только первое слово. Разве вы не хотите менять каждое слово, чтобы оно было написано в нижнем регистре?

Этот код будет служить Вам лучше:

var name = "AlbERt EINstEiN"; 

function nameChanger(oldName) { 

    // Your code goes here! 

    var finalName = []; 
    oldName.toLowerCase().split(" ").forEach(function(word) { 
     newWord = word.replace(word.charAt(0), word.charAt(0).toUpperCase()); 
     finalName.push(newWord); 
    }); 


    // Don't delete this line! 
    return finalName.join(" "); 
}; 

    // Did your code work? The line below will tell you! 
    console.log(nameChanger(name));