Не работает функция javascript, приводящая массив объектов к строке
Функция, должна привести массив объектов к строке вида:
Golden Branch, $1,825.65
Duncan Randall, $1,490.15
Но появляется следующая ошибка:
"Uncaught TypeError: ArrWithoutObj[i][j].join is not a function"
Почему выбрасывается исключение?
Код:
let user1 = {
"balance": "$1,825.65",
"picture": "https://placehold.it/32x32",
"age": 21,
"name": "Golden Branch",
"gender": "male",
"greeting": "Hello, Golden Branch! You have 7 unread messages.",
"favouriteFruit": "banana"
};
let user2 = {
"balance": "$1",
"picture": "https://placehold.it/32x32",
"age": 21,
"name": "Gol Bra",
"gender": "male",
"greeting": "Hello, Golden Branch! You have 7 unread messages.",
"favouriteFruit": "banana"
};
console.log(user1); //---
let users = [user1, user2];
console.log(users); //---
function showSalary(users, age) {
// ваш код...
console.log('----'); //---
let ArrUserAgeIsTrue = users.filter(item => {if (item.age <= age) return item;})
console.log(ArrUserAgeIsTrue); //---
let ArrNameAndBalance = ArrUserAgeIsTrue.map(item => {
let i = {
name: '',
balance: 0,
};
i.name = item.name;
i.balance = item.balance;
return i;
} );
console.log(ArrNameAndBalance); //---
let ArrWithoutObj = ArrNameAndBalance.map(item => {
return Object.values(item);
})
console.log(ArrWithoutObj); //---
let NewStr;
for (let i = 0; i <= ArrWithoutObj.length; i++) {
if (i != ArrWithoutObj.length) {
for(let j = 0; j <= 1; j++){
if (j == 0 ) {NewStr = ArrWithoutObj[i][j].join(', ')};
if (j == 1) {NewStr = ArrWithoutObj[i][j].join('\r\n')};
}
}
for(let j = 0; j <= 1; j++){
if (j == 0 ) {NewStr = ArrWithoutObj[i][j].join(', ')};
if (j == 1) {NewStr = ArrWithoutObj[i][j].join('')};
}
}
console.log(NewStr);
}
showSalary(users, 30)
Ответы (2 шт):
Автор решения: Rostyslav Kuzmovych
→ Ссылка
У вас там каша из кучи ненужного кода, вот пример, как можно сделать нужное простыми функциями массива :
const users = [{
"balance": "$1,825.65",
"picture": "https://placehold.it/32x32",
"age": 21,
"name": "Golden Branch",
"gender": "male",
"greeting": "Hello, Golden Branch! You have 7 unread messages.",
"favouriteFruit": "banana"
}, {
"balance": "$1",
"picture": "https://placehold.it/32x32",
"age": 21,
"name": "Gol Bra",
"gender": "male",
"greeting": "Hello, Golden Branch! You have 7 unread messages.",
"favouriteFruit": "banana"
}]
console.log(doIt(users, 30))
function doIt(users, age) {
return users.filter(u => u.age <= age).map(u => `${u.name}, ${u.balance}`).join('\r\n')
}
Понимаю, не совсем ответ на вопрос, но как образовательный пример может сгодиться )
Вот исправленный ваш пример, с комментариями в нужных местах :
let user1 = {
"balance": "$1,825.65",
"picture": "https://placehold.it/32x32",
"age": 21,
"name": "Golden Branch",
"gender": "male",
"greeting": "Hello, Golden Branch! You have 7 unread messages.",
"favouriteFruit": "banana"
};
let user2 = {
"balance": "$1",
"picture": "https://placehold.it/32x32",
"age": 21,
"name": "Gol Bra",
"gender": "male",
"greeting": "Hello, Golden Branch! You have 7 unread messages.",
"favouriteFruit": "banana"
};
console.log(user1); //---
let users = [user1, user2];
console.log(users); //---
function showSalary(users, age) {
// ваш код...
console.log('----'); //---
let ArrUserAgeIsTrue = users.filter(item => {if (item.age <= age) return item;})
console.log(ArrUserAgeIsTrue); //---
let ArrNameAndBalance = ArrUserAgeIsTrue.map(item => {
let i = {
name: '',
balance: 0,
};
i.name = item.name;
i.balance = item.balance;
return i;
} );
console.log(ArrNameAndBalance); //---
let ArrWithoutObj = ArrNameAndBalance.map(item => {
return Object.values(item);
})
console.log(ArrWithoutObj); //---
// присвоим пустую строку, иначе начальное значение будет undefined
let NewStr = '';
// < вместо <=
for (let i = 0; i < ArrWithoutObj.length; i++) {
// ArrWithoutObj массив массивов строк
// ArrWithoutObj[i] массив строк, поетому джоиним его по коме и добавляем в конец перенос каретки
// ArrWithoutObj[i][j] - строка, и как и написано в комментариях у строки нету метода join
NewStr += ArrWithoutObj[i].join(',') + '\r\n'
}
console.log(NewStr);
}
showSalary(users, 30)
Автор решения: RavenTheX
→ Ссылка
Мой вариант
let user1 = {
"balance": "$1,825.65",
"picture": "https://placehold.it/32x32",
"age": 21,
"name": "Golden Branch",
"gender": "male",
"greeting": "Hello, Golden Branch! You have 7 unread messages.",
"favouriteFruit": "banana"
};
let user2 = {
"balance": "$1",
"picture": "https://placehold.it/32x32",
"age": 21,
"name": "Gol Bra",
"gender": "male",
"greeting": "Hello, Golden Branch! You have 7 unread messages.",
"favouriteFruit": "banana"
};
let users = [user1, user2]
let arrToStr = (arr) => {
return users.map(user => `${user.name} ${user.balance}`).join(',')
}
console.log(arrToStr(users))