0

I'm trying to filter an array using 2 criteria : one is straigthforward (==1) and the other is an array. In the below example, i would want to filter : level = 0 or name comprises in ['B','S']

[
{id: 1, level: 0, name: 'A'},
{id: 2, level: 1, name: 'B'},
{id: 3, level: 1, name: 'S'},
{id: 4, level: 0, name: 'A'},
{id: 5, level: 0, name: 'S'},
{id: 6, level: 1, name: 'A'},
{id: 7, level: 0, name: 'B'}, ]

so the result would be :

[
{id: 1, level: 0, name: 'A'},
{id: 2, level: 1, name: 'B'},
{id: 3, level: 1, name: 'S'},
{id: 4, level: 0, name: 'A'},
{id: 5, level: 0, name: 'S'},
{id: 7, level: 0, name: 'B'}, ]

As i'm limited with ecmaScript-5 i cannot use .includes that would have helped here.

Also, i would like to stick to .filter function.

Any idea how to achieve this ?

thanks

4 Answers4

2

A simple loop would achieve this - and push the matching items into a new array that then has the desired items.

I have avoided the newer more exciting ways of doing this for the old school var and forEach approach to match your ecma-5 requirement.

var arr = [
{id: 1, level: 0, name: 'A'},
{id: 2, level: 1, name: 'B'},
{id: 3, level: 1, name: 'S'},
{id: 4, level: 0, name: 'A'},
{id: 5, level: 0, name: 'S'},
{id: 6, level: 1, name: 'A'},
{id: 7, level: 0, name: 'B'}, ]

var newArr = [];

arr.forEach(function(item) {
  if(item.level === 1 || (item.name === 'A' || item.name ==='B')) {
   newArr.push(item)
  }
})


console.log(newArr);

//gives[
  //{id: 1,level: 0, name": "A"},
  //{id: 2, level: 1, name: "B"},
  //{id: 3, level: 1, name: "S"},
  //{id: 4, level: 0, name: "A"},
  //{id: 6, level: 1, name: "A"},
  //{id: 7, level: 0, name: "B"}]
gavgrif
  • 15,194
  • 2
  • 25
  • 27
2

Using ecmaScript-5 you can do:

var arr = [{ id: 1, level: 0, name: 'A' },{ id: 2, level: 1, name: 'B' },{ id: 3, level: 1, name: 'S' },{ id: 4, level: 0, name: 'A' },{ id: 5, level: 0, name: 'S' },{ id: 6, level: 1, name: 'A' },{ id: 7, level: 0, name: 'B' },]

var result = arr.filter(function (obj) {
  return obj.level === 1 || ['B', 'S'].indexOf(obj.name) > -1;
})


console.log(result)
Nick Parsons
  • 45,728
  • 6
  • 46
  • 64
Yosvel Quintero
  • 18,669
  • 5
  • 37
  • 46
1

You can use the Array.prototype.filter() method along with the Array.prototype.indexOf() method to filter the array based on your criteria:

const array = [
  {id: 1, level: 0, name: 'A'},
  {id: 2, level: 1, name: 'B'},
  {id: 3, level: 1, name: 'S'},
  {id: 4, level: 0, name: 'A'},
  {id: 5, level: 0, name: 'S'},
  {id: 6, level: 1, name: 'A'},
  {id: 7, level: 0, name: 'B'},
];

var names = ['B', 'S'];

var result = array.filter(item => item.level === 0 || names.indexOf(item.name) !== -1);

console.log(result)
Joan Lara
  • 1,362
  • 8
  • 15
1

const arr = [
  { id: 1, level: 0, name: 'A' },
  { id: 2, level: 1, name: 'B' },
  { id: 3, level: 1, name: 'S' },
  { id: 4, level: 0, name: 'A' },
  { id: 5, level: 0, name: 'S' },
  { id: 6, level: 1, name: 'A' },
  { id: 7, level: 0, name: 'B' },
];

const newArr = arr.filter(
  item => item.level === 0 || item.name === 'B' || item.name === 'S'
);

console.log(newArr);
Jay
  • 2,826
  • 2
  • 13
  • 28