Фильтрация массива объектов
Нужно дополнить функцию getFriends(users) так, чтобы она возвращала массив друзей всех пользователей (свойство friends).
У нескольких пользователей могут быть одинаковые друзья, сделай так чтобы возвращаемый массив не содержал повторений.
Только начала обучение, познаю азы, помогите пожалуйста.
const users = [
{
name: "Moore Hensley",
email: "[email protected]",
eyeColor: "blue",
friends: ["Sharron Pace"],
isActive: false,
balance: 2811,
gender: "male",
age: 37
},
{
name: "Sharlene Bush",
email: "[email protected]",
eyeColor: "blue",
friends: ["Briana Decker", "Sharron Pace"],
isActive: true,
balance: 3821,
gender: "female",
age: 34
},
{
name: "Ross Vazquez",
email: "[email protected]",
eyeColor: "green",
friends: ["Marilyn Mcintosh", "Padilla Garrison", "Naomi Buckner"],
isActive: false,
balance: 3793,
gender: "male",
age: 24
},
]
// пытаюсь фильтровать, но явно что-то делаю не так...
const getFriends = (users)=> {
users.filter(user => user.friends);
(el, index, array) => array.indexOf(el) === index;
}
Ответы (5 шт):
Автор решения: Alexander Chernin
→ Ссылка
Почти в лоб:
function getFriends(users) {
// Результирующий массив
let a = [];
// Перебираем пользователей
for(let user of users) {
// Перебираем друзей пользователя user
for( let name of user.friends) {
// Ищем друга в массиве a
let index = a.findIndex( v => v === name );
// Если не нашли, то index === -1
if (index === -1) {
// Добавляем нового друга в массив
a.push(name);
}
}
}
return a;
}
Тоже самое, но в одну строку (почти. И вместо findIndex попробуем, мм, includes):
function getFriends(users) {
let a = [];
users.forEach( u => u.friends.forEach( f => { if (!a.includes(f)) a.push(f); }) );
return a;
}
Через Set
function getFriends(users) {
let s = new Set();
for(let u of users) {
// Пытаемся всех друзей очередного пользователя добавить в набор
// повторяющиеся будут проигнорированы
s = new Set([...s, ...u.friends]);
}
// Преобразуем набор в массив
return Array.from(s);
}
console.log(getFriends(users));
Автор решения: SwaD
→ Ссылка
Методом .reduce()
const users = [
{
name: "Moore Hensley",
email: "[email protected]",
eyeColor: "blue",
friends: ["Sharron Pace"],
isActive: false,
balance: 2811,
gender: "male",
age: 37
},
{
name: "Sharlene Bush",
email: "[email protected]",
eyeColor: "blue",
friends: ["Briana Decker", "Sharron Pace"],
isActive: true,
balance: 3821,
gender: "female",
age: 34
},
{
name: "Ross Vazquez",
email: "[email protected]",
eyeColor: "green",
friends: ["Marilyn Mcintosh", "Padilla Garrison", "Naomi Buckner"],
isActive: false,
balance: 3793,
gender: "male",
age: 24
},
]
function getFriends(arr) {
return arr.reduce((acc, item) => {
item.friends.forEach(friend => {
if (!acc.includes(friend)) acc.push(friend);
})
return acc;
}, []);
}
console.log(getFriends(users))
Автор решения: Pavel Nazarian
→ Ссылка
ну раз пошла такая пьянка )
const users = [
{
name: "Moore Hensley",
email: "[email protected]",
eyeColor: "blue",
friends: ["Sharron Pace"],
isActive: false,
balance: 2811,
gender: "male",
age: 37
},
{
name: "Sharlene Bush",
email: "[email protected]",
eyeColor: "blue",
friends: ["Briana Decker", "Sharron Pace"],
isActive: true,
balance: 3821,
gender: "female",
age: 34
},
{
name: "Ross Vazquez",
email: "[email protected]",
eyeColor: "green",
friends: ["Marilyn Mcintosh", "Padilla Garrison", "Naomi Buckner"],
isActive: false,
balance: 3793,
gender: "male",
age: 24
},
]
function getFriends(users) {
return [...new Set(users.map(user => user.friends).flat())]
}
console.log(getFriends(users))
Автор решения: Андрей Солуянов
→ Ссылка
Внесем еще один вариант, для будущих поколений .
function getFriends(arr) {
let b =[];
//Собираем все friends в один array.
arr.forEach((element)=>{
b = [...b, ...element.friends];
});
//Производим удаление одинаковых элементов.
let newArray = b.filter((item, pos) => b.indexOf(item) === pos);
return newArray;
}
console.log(getFriends(users))
Автор решения: tessa
→ Ссылка
Еще вариант:
const getFriends = users.flatMap(user => user.friends).filter((friend, index, array) => array.indexOf(friend) === index);
Можно разбить на 2 части:
const allFriends = users.flatMap(user => user.friends);
const getFriends = allFriends.filter((friend, index, array) => array.indexOf(friend) === index);
console.log(getFriends);