Guest User

Untitled

a guest
Nov 22nd, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.64 KB | None | 0 0
  1. var gFriends = [
  2. {
  3. name: 'Sam',
  4. friends: ['Mat', 'Sharon'],
  5. gender: 'male',
  6. best: true
  7. },
  8. {
  9. name: 'Sally',
  10. friends: ['Brad', 'Emily'],
  11. gender: 'female',
  12. best: true
  13. },
  14. {
  15. name: 'Mat',
  16. friends: ['Sam', 'Sharon'],
  17. gender: 'male'
  18. },
  19. {
  20. name: 'Sharon',
  21. friends: ['Sam', 'Itan', 'Mat'],
  22. gender: 'female'
  23. },
  24. {
  25. name: 'Brad',
  26. friends: ['Sally', 'Emily', 'Julia'],
  27. gender: 'male'
  28. },
  29. {
  30. name: 'Emily',
  31. friends: ['Sally', 'Brad'],
  32. gender: 'female'
  33. },
  34. {
  35. name: 'Itan',
  36. friends: ['Sharon', 'Julia'],
  37. gender: 'male'
  38. },
  39. {
  40. name: 'Julia',
  41. friends: ['Brad', 'Itan'],
  42. gender: 'female'
  43. }
  44. ];
  45.  
  46. const findFriendByName = (name, friends) => friends.find(friend => friend.name === name);
  47.  
  48. const bfsm = (allFriends, friends, levels, visited = new Set(), level = 0) => {
  49. if (!friends.length) {
  50. return;
  51. }
  52.  
  53. levels[level] = friends;
  54. friends.forEach(({ name }) => visited.add(name));
  55.  
  56. const nextLevelFriends = friends.reduce((acc, friend) => {
  57. acc.push(...friend.friends
  58. .filter(friendName => !visited.has(friendName))
  59. .map(friendName => findFriendByName(friendName, allFriends))
  60. );
  61.  
  62. return acc;
  63. }, []);
  64.  
  65. bfsm(allFriends, nextLevelFriends, levels, visited, level + 1);
  66. };
  67.  
  68. const levels = [];
  69.  
  70. bfsm(gFriends, gFriends.filter(({ best }) => best), levels);
  71.  
  72. levels.forEach((level, index) => {
  73. console.log(index + ' - ' + level.map(({ name }) => name));
  74. });
Add Comment
Please, Sign In to add comment