I can not filter the array objects using Filter

2

I'm trying to return the objects according to the id of the genres but an empty array is being returned

var filmes = [
    {
    title: 'Primeiro Filme',
    genres: [
        {
        id: 10
      },
      {
        id: 15
      },
      {
        id: 21
      }
    ]
  },
  {
    title: 'Segundo Filme',
    genres: [
        {
        id: 15
      },
      {
        id: 3
      },
      {
        id: 7
      }
    ]
  }
]



var filmesCategorias = filmes.filter(function(filme){
  return filme.genres.id == 3
})

console.log(filmesCategorias)
    
asked by anonymous 18.01.2018 / 13:39

2 answers

3

Replace:

return filme.genres.id == 3 

by:

return filme.genres.find(x => x.id == 3)

working code:

var filmes = [
    {
    title: 'Primeiro Filme',
    genres: [
        {
        id: 10
      },
      {
        id: 15
      },
      {
        id: 21
      }
    ]
  },
  {
    title: 'Segundo Filme',
    genres: [
        {
        id: 15
      },
      {
        id: 3
      },
      {
        id: 7
      }
    ]
  }
]



var filmesCategorias = filmes.filter(function(filme){
  return filme.genres.find(x => x.id == 3)
})

console.log(filmesCategorias)
    
18.01.2018 / 14:02
2

The genres is a array so you need to scan the positions for the id==3 search, eg:

var filmes = [{
    title: 'Primeiro Filme',
    genres: [{
        id: 10
      },
      {
        id: 15
      },
      {
        id: 21
      }
    ]
  }, {
    title: 'Segundo Filme',
    genres: [{
        id: 10
      },
      {
        id: 3
      },
      {
        id: 21
      }
    ]
  },
  {
    title: 'Terceiro Filme',
    genres: [{
        id: 15
      },
      {
        id: 3
      },
      {
        id: 7
      }
    ]
  }
]



var filmesCategorias = filmes.filter(function(filme) {

  for (i = 0; i < filme.genres.length; i++) {
    if (filme.genres[i].id == 3) {
      return true;
    }
  }
  
  return false;
})

console.log(filmesCategorias)

The filter command has its compatibility below :

Source: Array.prototype. filter () - Browser Compatibility

By using find you can simplify the code, but limit its use in browsers as the table below:

Source: Array.prototype. find () - Browser Compatibility

An way without these commands that at some point may limit its use , with two repeat structures may solve the same problem, for example:

var filmes = [{
    title: 'Primeiro Filme',
    genres: [{
        id: 10
      },
      {
        id: 15
      },
      {
        id: 21
      }
    ]
  }, {
    title: 'Segundo Filme',
    genres: [{
        id: 10
      },
      {
        id: 3
      },
      {
        id: 21
      }
    ]
  },
  {
    title: 'Terceiro Filme',
    genres: [{
        id: 15
      },
      {
        id: 3
      },
      {
        id: 7
      }
    ]
  }
]

function findFilmeGenresById()
{
    var item = Array();    
    for(i = 0; i < filmes.length; i++)
    {
        for(j = 0; j < filmes[i].genres.length; j++)
        {
          if (filmes[i].genres[j].id == 3)
          {
            item.push(filmes[i]); 
            break;
          }
        }        
    }
    return item;
}

console.log(findFilmeGenresById());
    
18.01.2018 / 14:03