Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //FILTERS
- var filterItems = [{
- category: "lisboa",
- group: "a",
- selected: true,
- active: true
- },
- {
- category: "portugal",
- group: "a",
- selected: true,
- active: true
- },
- {
- category: "damaia",
- group: "a",
- selected: false,
- active: true
- },
- {
- category: "oeiras",
- group: "b",
- selected: true,
- active: true
- },
- {
- category: "amadora",
- group: "b",
- selected: true,
- active: true
- },
- {
- category: "almada",
- group: "c",
- selected: false,
- active: true
- }
- ];
- //LIST OF ITEMS
- var listItems = [{
- id: "praia carcavelos",
- categories: ["lisboa","portugal", "oeiras"],
- visible: false
- },
- {
- id: "rua neudel",
- categories: ["amadora","portugal", "damaia"],
- visible: false
- },
- {
- id: "fronteira",
- categories: ["amadora","portugal", "lisboa"],
- visible: false
- },
- {
- id: "em almada",
- categories: ["almada", "oeiras"],
- visible: false
- }
- ];
- //FUNCTIONS
- var groupBy = function(xs, key) {
- return xs.reduce(function(rv, x) {
- (rv[x[key]] = rv[x[key]] || []).push(x);
- return rv;
- }, {});
- };
- var matchesAtLeastOneFilter = function(listItem, filters){
- for(var prop in filters){
- if(listItem.categories.includes(filters[prop].category)){
- return true;
- }
- }
- return false;
- }
- var setListItemsVisibility = function(groupedByFilters){
- listItems.forEach(function(listItem) {
- listItem.visible = true;
- for(var group in groupedByFilters){//must be true for all groups
- var filterList = groupedByFilters[group];
- //debugger;
- if(!matchesAtLeastOneFilter(listItem, filterList)){
- listItem.visible = false;
- break;
- }
- }
- })
- }
- var updateVisibleItems = function(){
- var hasSelectedFilter = filterItems.find(function(element) {
- return element.selected;
- });
- if(!hasSelectedFilter){
- listItems.forEach(function(element) {
- element.visible = true;
- });
- }else{
- var selectedFilters = filterItems.filter(x => x.selected);
- if(selectedFilters.length > 0){
- setListItemsVisibility(groupBy(selectedFilters, 'group'));
- }
- // console.log(selectedFilter[0].category == listItems[1].categories[2]);
- }
- }
- var getVisibleItems = function(){
- var ret = [];
- for(var prop in listItems){
- if(listItems[prop].visible){
- ret.push(listItems[prop].id);
- }
- }
- return ret;
- }
- function arraysEqual(_arr1, _arr2) {
- if (!Array.isArray(_arr1) || ! Array.isArray(_arr2) || _arr1.length !== _arr2.length)
- return false;
- var arr1 = _arr1.concat().sort();
- var arr2 = _arr2.concat().sort();
- for (var i = 0; i < arr1.length; i++) {
- if (arr1[i] !== arr2[i])
- return false;
- }
- return true;
- }
- function updateFiltersActiveState(visibleItems) {
- for(var prop in filterItems){
- var filterItem = filterItems[prop];
- if(!filterItem.selected){
- filterItem.selected = true;
- }else{
- continue;
- }
- updateVisibleItems();
- filterItem.selected = false;
- var visibleItemsWithOneMoreActiveFilter = getVisibleItems();
- if(!listItems.find(function(element) {
- return element.visible;
- }) || arraysEqual(visibleItems, visibleItemsWithOneMoreActiveFilter)){
- filterItem.active = false;
- }
- }
- }
- var selectedFilters = filterItems.filter(x => x.selected);
- if(selectedFilters.length > 0){
- for(var prop in selectedFilters){
- console.log("selected filter: " + selectedFilters[prop].category + " - group: " + selectedFilters[prop].group);
- }
- }
- //MAIN PROGRAM
- updateVisibleItems();
- updateFiltersActiveState(getVisibleItems());
- updateVisibleItems();
- //OUTPUT
- console.log("Results:");
- listItems.forEach(function(element) {
- if(element.visible){
- console.log(element);
- }
- });
- console.log("Filter states:");
- filterItems.forEach(function(element) {
- console.log(element.category + " (" + element.group + ") active: " + element.active);
- });
- debugger;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement