Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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));
- });
Add Comment
Please, Sign In to add comment