Skip to content Skip to sidebar Skip to footer

Javascript Multiple Filters Array

My question is extension to this question javascript filter array multiple conditions from that question if filter object is {address: 'England', name: 'Mark'}; and array is var

Solution 1:

You'd use filter on users and every on the filter object's entries

const filter = {address: 'England', name: 'Mark'};

const res = users.filter(user =>Object.entries(filter)
  .every(([k,v]) => v === '' || user[k] === v)
);
console.log(res);
<script>var users = [{
  name: 'John',
  email: 'johnson@mail.com',
  age: 25,
  address: 'USA'
},
  {
    name: 'Tom',
    email: 'tom@mail.com',
    age: 35,
    address: 'England'
  },
  {
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    address: 'England'
  }
];
</script>

Solution 2:

From the example in the post you mention, just continue if the filter is blank

var filter = {address: 'England', name: ''}
var users = [{
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    address: 'USA'
  },
  {
    name: 'Tom',
    email: 'tom@mail.com',
    age: 35,
    address: 'England'
  },
  {
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    address: 'England'
  }
];

users = users.filter(function(item) {
  for (var key in filter) {
    if (filter[key] == "") continue; // added this:if (item[key] === undefined || item[key] != filter[key])
      returnfalse;
  }
  returntrue;
});
console.log(users)

Solution 3:

You can use a combination of filter and every with some ternary logic to determine if the filter value is empty to get all.

var users = [{
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    address: 'USA'
  },
  {
    name: 'Tom',
    email: 'tom@mail.com',
    age: 35,
    address: 'England'
  },
  {
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    address: 'England'
  }
];

var filter1 = {address: 'England', name: 'Mark'};
var filter2 = {address: 'England', name: ''};

functionfindResults(input, filterObj){
   return input.filter(
      item =>Object.keys(filterObj)
                    .every(r => filterObj[r].length 
                                   ? item[r] == filterObj[r] 
                                   : true)
   )
}

console.log('with address and name', findResults(users,filter1));
console.log('with address only', findResults(users,filter2));

Solution 4:

If I understand your question correctly you need following output. If this what you are looking for Array.filter should suffice your use case. Take a look at the code sandbox where I have created a function filterByObj which takes arr, filterObj as arguments and returns given output for { address: "England", name: "" }

enter image description here

Solution 5:

You need you filter for this case.

var filter1 = {
  address: 'England',
  name: 'Mark'
};

var filter2 = {
  address: 'England',
  name: ''
};

var users = [
  {
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    address: 'USA'
  },
  {
    name: 'Tom',
    email: 'tom@mail.com',
    age: 35,
    address: 'England'
  },
  {
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    address: 'England'
  }
];

functionfilterUser(arr, obj) {
  return arr.filter(function(item) {
    return (
      (obj.address === '' || item.address === obj.address) &&
      (obj.name === '' || item.name === obj.name)
    );
  });
}

console.log(filterUser(users, filter1));
console.log(filterUser(users, filter2));

Post a Comment for "Javascript Multiple Filters Array"