Format a string of names like 'Bart, Lisa & Maggie'.

Format a string of names like 'Bart, Lisa & Maggie'.

Given: an array containing hashes of names

Return: a string formatted as a list of names separated by commas except for the last two names, which should be separated by an ampersand.

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

배열이 주어지면 배열 내 객체의 'name' 속성의 string을 위와 같이 포맷 후 반환하는 문제입니다. 저는 다음과 같은 방식으로 문제를 풀었습니다.

  1. 객체의 'name' 값들만 모아서 새로운 배열을 만듬
  2. 새로운 배열의 마지막 요소 바로 전 요소로 '&'를 추가함
  3. 배열을 ', '로 합치 string으로 만들고 ', &, '를 -> ' & '로 변경함
  4. 배열의 길이가 1일 경우, 포맷 변경이 불필요하기 때문에 예외처리함.
function list(names) {
  var namesArr = names.map(function(cur) {
    return cur['name'];
  });

  if (namesArr.length > 1) {
    namesArr.splice(-1, 0, '&');
  }

  return namesArr.join(', ').replace(', &, ', ' & ');
}

문제 풀이 후, 가장 추천수를 많이 받은 코드를 참고했습니다. reduce를 사용했으며 코드 읽기가 더 수월한 것 같습니다.

reduce로 배열의 각 요소를 ', '로 연결하고 마지막 index에서만 ' & '로 연결한 accumulation을 반환했습니다.

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;
    }
  }, '');
}