Skip to content

Instantly share code, notes, and snippets.

@Superilya
Created November 21, 2017 16:44
Show Gist options
  • Save Superilya/00aaa2f8ca7354f448c092b51cc77dd8 to your computer and use it in GitHub Desktop.
Save Superilya/00aaa2f8ca7354f448c092b51cc77dd8 to your computer and use it in GitHub Desktop.
var gFriends = [
{
name: 'Sam',
friends: ['Mat', 'Sharon'],
gender: 'male',
best: true
},
{
name: 'Sally',
friends: ['Brad', 'Emily'],
gender: 'female',
best: true
},
{
name: 'Mat',
friends: ['Sam', 'Sharon'],
gender: 'male'
},
{
name: 'Sharon',
friends: ['Sam', 'Itan', 'Mat'],
gender: 'female'
},
{
name: 'Brad',
friends: ['Sally', 'Emily', 'Julia'],
gender: 'male'
},
{
name: 'Emily',
friends: ['Sally', 'Brad'],
gender: 'female'
},
{
name: 'Itan',
friends: ['Sharon', 'Julia'],
gender: 'male'
},
{
name: 'Julia',
friends: ['Brad', 'Itan'],
gender: 'female'
}
];
const findFriendByName = (name, friends) => friends.find(friend => friend.name === name);
const bfsm = (allFriends, friends, levels, visited = new Set(), level = 0) => {
if (!friends.length) {
return;
}
levels[level] = friends;
friends.forEach(({ name }) => visited.add(name));
const nextLevelFriends = friends.reduce((acc, friend) => {
acc.push(...friend.friends
.filter(friendName => !visited.has(friendName))
.map(friendName => findFriendByName(friendName, allFriends))
);
return acc;
}, []);
bfsm(allFriends, nextLevelFriends, levels, visited, level + 1);
};
const levels = [];
bfsm(gFriends, gFriends.filter(({ best }) => best), levels);
levels.forEach((level, index) => {
console.log(index + ' - ' + level.map(({ name }) => name));
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment