Uncaught TypeError: Cannot read property 'name' of undefined
Простая задача на кодварс, все тесты код проходит, но ошибка "Uncaught TypeError: Cannot read property 'name' of undefined" не пропускает решение. В чем проблема и почему в строке под * names[names.length - 2].name - undefiend?
Условие задачи:
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'
list([ {name: 'Bart'}, {name: 'Lisa'} ])
// returns 'Bart & Lisa'
list([ {name: 'Bart'} ])
// returns 'Bart'
list([])
// returns ''
Мое решение:
function list(names){
let result = names.map(item => item.name).join(', ').split(' ');
result[result.length - 2] = names[names.length - 2].name + ' &'; //*
result = result.join(' ');
console.log(result);
}
Ответы (1 шт):
Задачу, конечно, тоже хотелось бы увидеть, но в данном вопросе и так сойдет. На данный момент у вас в result список имен, а не объектов:
result = ['Bart,', 'Lisa,', 'Maggie,', 'Homer,', 'Marge']
Когда вы получаете строку "Homer" и пытаетесь потом сделать "Homer".name получаете undefined т.к. у строки никакого name нет.
list([{name: 'Bart'},{name: 'Lisa'},{name: 'Maggie'},{name: 'Homer'},{name: 'Marge'}])
list([ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'} ])
list([ {name: 'Bart'}, {name: 'Lisa'} ])
list([ {name: 'Bart'} ])
list([])
function list(names){
let result = names.map(item => item.name).join(', ').split(' ');
result[result.length - 2] = names[names.length - 2] && names[names.length - 2].name + ' &'; //*
result = result.join(' ');
console.log(result);
}
--- UPD ---
Если вы используете уже map и другие функции массивов, можно взять к себе на вооружение reduce и reduceRight, которые очень помогают в некоторых случаях.
list([{name: 'Bart'},{name: 'Lisa'},{name: 'Maggie'},{name: 'Homer'},{name: 'Marge'}])
list([ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'} ])
list([ {name: 'Bart'}, {name: 'Lisa'} ])
list([ {name: 'Bart'} ])
list([])
function list(names){
let result = names.length === 0 ? '' : names.map(x => x.name).reduceRight((p, c, i, a) => {
return c + (i === a.length - 2 ? " & " : ", ") + p;
})
console.log(result);
}