В повседневной жизни мы сталкиваемся с множеством проблем. Как программист, мы наблюдаем за проблемой и пишем строку или строки кода для решения проблемы. Но оптимальное решение всегда стоит. Если ее легко читать, то она еще круче.

Любой дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям.

Давайте обсудим на примере проблемы и ее многократного решения

Перед нами стоит задача, которая описывается как:

Дано: массив, содержащий хеши имен.

Возврат: строка, отформатированная как список имен, разделенных запятыми, за исключением последних двух имен, которые должны быть разделены амперсандом.

Пример

list([ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'} ]) // returns 'Bart, Lisa & Maggie'  
list([ {name: 'Bart'}, {name: 'Lisa'} ]) 
// returns 'Bart & Lisa'  
list([ {name: 'Bart'} ]) 
// returns 'Bart'  
list([]) 
// return ''

Теперь давайте найдем решения. Сначала мы решим это с помощью очень простого решения

function list(names) {
var len = names.length; var result = "";
for (var now = 0; now < len; now++) {
 result += names[now]["name"];
 if (now != len - 1)
  if (now == len - 2) 
    result += " & "
  else if (now < len - 2) 
    result += ", "
 }
 return result;
}

Теперь давайте немного изменим его, добавив немного чистоты JS.

function list(names) {
 n = names.map(name => name.name);
 return (n.length > 1 ? n.slice(0, -1).join(", ") + " & " +        n[n.length - 1] : n.join())
}

Теперь это может сбивать с толку, поскольку мы обсуждали выше, хороший код должен быть понятным. Пусть будет другой подход

function list(people) {
if (!people.length)
 return '';
if (people.length === 1)
 return people[0].name;
var lastPerson = people.pop();
return `${people.map(p => p.name).join(', ')} & ${lastPerson.name}`;
}

В этом есть некоторые особенности ES6.

Теперь другой подход с некоторыми функциями JS, чтобы сделать вещи более чистыми и быстрыми и, очевидно, с хорошим подходом.

function list(names) {
if (names.length === 0)
 return ''
if (names.length === 1) 
 return names[0].name
return names
 .slice(0, names.length - 1)
 .map((name) => { return `${name.name}`})
 .join(', ')
 .concat(` & ${names[names.length - 1].name}`)
}

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

function list(names){
 return names.reduce(function(prev, current, index, array){
  if (index === 0){
   return current.name;
  }
  else if (index === array.length - 1){
   return prev + ' & ' + current.name;
  }
  else {
   return prev + ', ' + current.name;
  }
 }, '');
}

Заключение

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

Это все люди

Надеюсь, вам понравится обсуждение.