Индексы массива начинаются с 0, поэтому length - 1
является последним элементом массива, а не вторым по последнему.
Попробуйте заменить i !== length - 1
на i < length - 2
в вашем первом состоянии:
function list(names){
let output = "";
let length = names.length;
for(i=0; i < length; i++){
if(length > 2 && i < length - 2){
output += names[i]['name'] + ', ' ;
}
else if( i == length - 1 && i !== 0) {
output += ' & ' + names[i]['name'] ;
} else{
output += names[i]['name'];
}
}
return output;
}
console.log(list([ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'}, {name: 'Homer'}, {name: 'Marge'} ]))
// returns Bart, Lisa, Maggie, Homer & Marge
console.log(list([ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'} ]))
// returns 'Bart, Lisa & Maggie'
console.log(list([ {name: 'Bart'}, {name: 'Lisa'} ]))
// returns 'Bart & Lisa'
console.log(list([ {name: 'Bart'} ]))
// returns 'Bart'
console.log(list([]))
// returns ''
Немного очистив его с помощью reduceRight
и некоторых функций ES6, мы могли бы также написать это как:
function list(names){
let length = names.length;
if (length === 0) {
return '';
}
return names
.map(n => n.name)
.reduceRight((acc, cur, i) => `${cur}${i < length - 2 ? ', ' : ' & '}${acc}`);
}
console.log(list([ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'}, {name: 'Homer'}, {name: 'Marge'} ]))
// returns Bart, Lisa, Maggie, Homer & Marge
console.log(list([ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'} ]))
// returns 'Bart, Lisa & Maggie'
console.log(list([ {name: 'Bart'}, {name: 'Lisa'} ]))
// returns 'Bart & Lisa'
console.log(list([ {name: 'Bart'} ]))
// returns 'Bart'
console.log(list([]))
// returns ''