Zeus
Zeus

Reputation: 331

Javascript Return Conditionals

   searchList(array, filters) { 
      var currentUserId = 125;
      var list = array;  
      // array example [{aisle: A9, userid: 125},{aisle: B2, userid: null},{aisle: C#, userid: 125}] 
      // filters example {assignedButtonActive: true, unassignedButtonActive: false, aisle: A9}
      
      result = Object.keys(list)
        .map((key) => {
          return { ...list[key] };
        })
        .filter((data) => {
          // If assigned or unassigned buttons are not active, this filter doesnt apply and aisle should be the only thing filtering
          let assigned = filters.assignedButtonActive
          let unassigned = filters.unassignedButtonActive
          let aisleSelection = filter.aisle;
          let aisle = data.aisle;
          let userid = data.userid;

          return aisle.indexOf(aisleSelection) > -1 // Need a conditional to also filter out assigned/unassigned if the buttons are active, otherwise not needed.
        });

      return result;
    }

I am trying to filter a list with the combination of an input search and button/flags. I have no problem with the input search function filtering and returning the list. The problem Im having is using boolean flags along with the search input to be even more exact on what i want to filter, but I am having an issue on how to return the result using conditionals/booleans in this case. I cant seem to mix the two conditions for a return with both filters applied. I've tried something like this return aisle.indexOf(aisleSelection) > -1 && (assigned) ? assignedTo == currentUserId : (unassigned) ? assignedTo == null : [] but seems I'm way off. For example if either assigned/unassigned flags are active, it will add one of these two filters assignedTo === currentUserId or assignedTo == null to filter along with aisle filter as well, pretty much so they can work together as well, not one or the other

Not looking for the solution written out for me, more on how I can handle this filtering beyond just an input, with the possibility to off more filters being used

Any help/tips would be greatly appreciated

Upvotes: 0

Views: 52

Answers (3)

Based on what I have understood, follow through this code especially the part I have commented then let me know if this what you wanted. If there's you don't get, let me know.

function searchList(array, filters) {

  var currentUserId = 125;
  var list = array;  


  result = Object.keys(list)
    .map((key) => ({ ...list[key] }))
    .filter((data) => {
      let assignedSelection = filters.assignedButtonActive;
      let unassignedSelection = filters.unassignedButtonActive;
      let aisleSelection = filters.aisle;

      let aisle = data.aisle;
      let userid = data.userid;

      return Boolean(Boolean(assignedSelection) || Boolean(unassignedSelection)) && aisle.includes(aisleSelection)?assignedTo = currentUserId:assignedTo = null;

      /**
      Explanation:
       
           I am not sure of what you wanted to achieve with this, but follow through and see If this is what you wanted.

           1. Boolean(Boolean(assignedSelection) || Boolean(unassignedSelection)) 
           This part will return true if either assignedSelection or unassignedSelection is true.
           This part will return false if both assignedSelection and unassignedSelection are false.

           2. aisle.includes(aisleSelection) 
           This part will return true if aisleSelection matches aisle
           This part will return false if aisleSelection does not match aisle

           3. Boolean(Boolean(assignedSelection) || Boolean(unassignedSelection)) &&  aisle.includes(aisleSelection)
           This part will return true if both part_(1) and part_(2) return true
           Thus part will return false if either part_(1) or part_(2) returns false

           4. return Boolean(Boolean(assignedSelection) || Boolean(unassignedSelection)) && aisle.includes(aisleSelection)? assignedTo = currentUserId : assignedTo = null;
           This part will return null if part_(3) returns false
           This part will give the variable assignedTo the value currentUserId if part_(3) returns true

          */
    });

  return result;
}

//Execute the example
var arrayExample = [
  { aisle: "A9", userid: 125 },
  { aisle: "B2", userid: null },
  { aisle: "C#", userid: 126 },
];
var filtersExample = {
  assignedButtonActive: true,
  unassignedButtonActive: false,
  aisle: "A9",
};

searchList(arrayExample, filtersExample);

Upvotes: 1

romanown
romanown

Reputation: 345

in such cases, I use the usual brackets to show the individual parts of the inequality. example

return aisle.indexOf(aisleSelection) > -1 && (assigned) ? assignedTo == currentUserId : ((unassigned) ? assignedTo == null : [])

but maybe

return assignedTo = (aisle.indexOf(aisleSelection) > -1 && (assigned) ? currentUserId : ((unassigned) ? null : []))

I may have misunderstood the necessary conditions. if you describe the conditions in more detail, the answer will be more correct.

Upvotes: 0

lndrcrvlh
lndrcrvlh

Reputation: 51

Finish out the function before returning, then have different return statements for each condition rather than

return aisle.indexOf(aisleSelection) > -1

try

if (aisle.indexOf(aisleSelection) > -1) {
return true} 
else if (other possibility){
return true} 
else (case to filter out){
return false}

filter gets called on each element in the array, and decides to keep the element if the callback function returns true

Upvotes: 1

Related Questions