Advertisement
Guest User

Untitled

a guest
Jul 18th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.91 KB | None | 0 0
  1. //FILTERS
  2. var filterItems = [{
  3. category: "lisboa",
  4. group: "a",
  5. selected: true,
  6. active: true
  7. },
  8. {
  9. category: "portugal",
  10. group: "a",
  11. selected: true,
  12. active: true
  13. },
  14. {
  15. category: "damaia",
  16. group: "a",
  17. selected: false,
  18. active: true
  19. },
  20. {
  21. category: "oeiras",
  22. group: "b",
  23. selected: true,
  24. active: true
  25. },
  26. {
  27. category: "amadora",
  28. group: "b",
  29. selected: true,
  30. active: true
  31. },
  32. {
  33. category: "almada",
  34. group: "c",
  35. selected: false,
  36. active: true
  37. }
  38. ];
  39.  
  40. //LIST OF ITEMS
  41. var listItems = [{
  42. id: "praia carcavelos",
  43. categories: ["lisboa","portugal", "oeiras"],
  44. visible: false
  45. },
  46. {
  47. id: "rua neudel",
  48. categories: ["amadora","portugal", "damaia"],
  49. visible: false
  50. },
  51. {
  52. id: "fronteira",
  53. categories: ["amadora","portugal", "lisboa"],
  54. visible: false
  55. },
  56. {
  57. id: "em almada",
  58. categories: ["almada", "oeiras"],
  59. visible: false
  60. }
  61. ];
  62.  
  63.  
  64.  
  65. //FUNCTIONS
  66. var groupBy = function(xs, key) {
  67. return xs.reduce(function(rv, x) {
  68. (rv[x[key]] = rv[x[key]] || []).push(x);
  69. return rv;
  70. }, {});
  71. };
  72.  
  73. var matchesAtLeastOneFilter = function(listItem, filters){
  74. for(var prop in filters){
  75. if(listItem.categories.includes(filters[prop].category)){
  76. return true;
  77. }
  78. }
  79. return false;
  80. }
  81.  
  82. var setListItemsVisibility = function(groupedByFilters){
  83. listItems.forEach(function(listItem) {
  84. listItem.visible = true;
  85. for(var group in groupedByFilters){//must be true for all groups
  86. var filterList = groupedByFilters[group];
  87. //debugger;
  88. if(!matchesAtLeastOneFilter(listItem, filterList)){
  89. listItem.visible = false;
  90. break;
  91. }
  92. }
  93. })
  94. }
  95.  
  96. var updateVisibleItems = function(){
  97. var hasSelectedFilter = filterItems.find(function(element) {
  98. return element.selected;
  99. });
  100.  
  101. if(!hasSelectedFilter){
  102. listItems.forEach(function(element) {
  103. element.visible = true;
  104. });
  105. }else{
  106. var selectedFilters = filterItems.filter(x => x.selected);
  107. if(selectedFilters.length > 0){
  108. setListItemsVisibility(groupBy(selectedFilters, 'group'));
  109. }
  110. // console.log(selectedFilter[0].category == listItems[1].categories[2]);
  111. }
  112. }
  113.  
  114. var getVisibleItems = function(){
  115. var ret = [];
  116. for(var prop in listItems){
  117. if(listItems[prop].visible){
  118. ret.push(listItems[prop].id);
  119. }
  120. }
  121. return ret;
  122. }
  123.  
  124. function arraysEqual(_arr1, _arr2) {
  125. if (!Array.isArray(_arr1) || ! Array.isArray(_arr2) || _arr1.length !== _arr2.length)
  126. return false;
  127. var arr1 = _arr1.concat().sort();
  128. var arr2 = _arr2.concat().sort();
  129. for (var i = 0; i < arr1.length; i++) {
  130. if (arr1[i] !== arr2[i])
  131. return false;
  132. }
  133. return true;
  134. }
  135.  
  136. function updateFiltersActiveState(visibleItems) {
  137. for(var prop in filterItems){
  138. var filterItem = filterItems[prop];
  139. if(!filterItem.selected){
  140. filterItem.selected = true;
  141. }else{
  142. continue;
  143. }
  144. updateVisibleItems();
  145. filterItem.selected = false;
  146. var visibleItemsWithOneMoreActiveFilter = getVisibleItems();
  147. if(!listItems.find(function(element) {
  148. return element.visible;
  149. }) || arraysEqual(visibleItems, visibleItemsWithOneMoreActiveFilter)){
  150. filterItem.active = false;
  151. }
  152. }
  153. }
  154.  
  155. var selectedFilters = filterItems.filter(x => x.selected);
  156. if(selectedFilters.length > 0){
  157. for(var prop in selectedFilters){
  158. console.log("selected filter: " + selectedFilters[prop].category + " - group: " + selectedFilters[prop].group);
  159. }
  160. }
  161.  
  162. //MAIN PROGRAM
  163. updateVisibleItems();
  164. updateFiltersActiveState(getVisibleItems());
  165.  
  166. updateVisibleItems();
  167.  
  168. //OUTPUT
  169. console.log("Results:");
  170. listItems.forEach(function(element) {
  171. if(element.visible){
  172. console.log(element);
  173. }
  174. });
  175.  
  176. console.log("Filter states:");
  177. filterItems.forEach(function(element) {
  178. console.log(element.category + " (" + element.group + ") active: " + element.active);
  179. });
  180. debugger;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement