2015-12-10 2 views
0

Я новичок в программировании. Я написал решение двумя разными способами, но хотел бы знать, что считается лучшим решением и почему.Заглавие случая предложение - какое решение лучше и почему?

Кроме того, с точки зрения производительности, почему лучше считаться лучше?

Решение 1:

function titleCase(str) { 
    str = str.toLowerCase(); 
    str = str.split(""); 
    str[0] = str[0].toUpperCase(); 
    for(i = 1; i<str.length; i++){ 
    if(str[i+1] == " "){ 
     str[i+2] = str[i+2].toUpperCase(); 
    } 
    } 
    str = str.join(""); 
    return str; 
} 

Решение 2:

function titleCase(str) { 
    str = str.toLowerCase(); 
    str = str.split(" "); 
    str = str.map(function(val){ 
    val = val.charAt(0).toUpperCase() + val.slice(1); 
    return val; 
    }); 
    str = str.join(" "); 
    return str; 
} 
+3

Первая неудачная строка с пробелом в конце. – Pointy

+0

Или просто используйте [библиотеку] (https://www.npmjs.com/package/titlecase). – Anko

+0

@anko Я мог бы использовать библиотеку, но это всего лишь небольшая задача, которую я установил, и хотел бы знать, что может быть лучше. – Frenchiejnr

ответ

2

Какое решение лучше?

Вашего второе решение лучше, но может быть лучше, приковав метод призывает str и удаление ненужного повторного назначения val в вашем map:

function titleCase(str) { 
    return str 
     .toLowerCase() 
     .split(" ") 
     .map(function (val) { 
      return val.charAt(0).toUpperCase() + val.slice(1); 
     }) 
     .join(" "); 
} 

Или с помощью ES6 мы можем уменьшить размер ваш map блок с arrow function:

function titleCase(str) { 
    return str 
     .toLowerCase() 
     .split(" ") 
     .map((val) => val.charAt(0).toUpperCase() + val.slice(1)) 
     .join(" "); 
} 

Я бы сказал, что наиболее очевидная причина второго решения является лучшим заключается в том, что его легче понять. С помощью названных методов, таких как map, с самого начала ясно, какие операции выполняются. Непонятно, глядя на цикл for, что вы сопоставляете значения.

______

Что лучше для производительности?

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

+0

Я не знал, что вы можете сделать этот тип .notation. Спасибо – Frenchiejnr

+1

Все эти функции возвращают строку, поэтому вы в основном объединяете функции строк :) – Matheus208

1

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

Она также может быть сокращена до одной простой цепи, без того много назначений переменных, что делает его еще проще понять:

function titleCase(str) { 
    return str.toLowerCase() 
    .split(" ") 
    .map(function(val) { 
    return val.charAt(0).toUpperCase() + val.slice(1); 
    }) 
    .join(" "); 
} 

Чем сложнее структура цикла в первой также является причиной для двух ошибки:

  • Это не название регистр строка, начинающаяся с пробелом
  • Он бросает на струнах, которые заканчиваются в пространстве

Когда цикл из 1 в length-1, вы должны были использовать str[i-1] == " " и str[i] = ….

Также обратите внимание на то, что обычно считается неправильной практикой назначать два разных типа одной и той же переменной.При работе со строкой и массивом символов вы должны использовать для них две разные переменные, вместо str для обоих.

1: Следует признать, что то же самое произойдет в вашей второй функции были вы использовали val[0].toUpperCase() вместо .charAt(0) (что дает пустую строку вместо undefined для вышедших из диапазона индексов)

+0

Спасибо за этот ответ. Существуют ли затраты на производительность, связанные с переназначением переменной? – Frenchiejnr

+1

@Frenchiejnr: маловероятно. Это больше затраты на ремонтопригодность, связанные с многословием. – Bergi

-1

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

function titleCase(str) { 
    return str 
    .toLowerCase() 
    .split(" ") 
    .map(word => word[0].toUpperCase() + word.slice(1)) 
    .join(" ") 
} 

конечно словоразделы являются проблемой.

+0

Не бойтесь удивительного мистера Давнителя! –

+1

«Мне нравится мой взгляд» не делает ничего, чтобы объяснить, почему вам это нравится. –

+0

@AdrianLynch OP не был о ES6, он не спрашивал о том, что вам нравится, но о том, какой из них лучше и почему. Поэтому ваш ответ не полезен и не соответствует теме. – Hacketo

Смежные вопросы