JS (ES6): Filter array based on nested array attributes

前端 未结 7 919
醉梦人生
醉梦人生 2020-12-20 17:48

I have an array, which looks like this:

const persons = [
  {
    name: \"Joe\",
    animals: [
      {species: \"dog\", name: \"Bolt\"},
      {species: \"c         


        
相关标签:
7条回答
  • 2020-12-20 18:11

    Your inner filter still returns a "truthy" value (empty array) for the dog person. Add .length so that no results becomes 0 ("falsey")

    const result = persons.filter(p => p.animals.filter(s => s.species === 'cat').length)

    Edit: Per comments and several other answers, since the goal is to get a truthy value from the inner loop, .some would get the job done even better because it directly returns true if any items match.

    const result = persons.filter(p => p.animals.some(s => s.species === 'cat'))

    0 讨论(0)
  • 2020-12-20 18:16

    You havent checked against the length of the second filter.

    Filer only includes results that return a true value. So we need to provide the second filter with a way of returning true if it finds something. We can do that by saying, if the returned array is > 0

    const persons = [
      {
        name: "Joe",
        animals: [
          {species: "dog", name: "Bolt"},
          {species: "cat", name: "Billy"},
        ]
      },
      {
        name: "Bob",
        animals: [
          {species: "dog", name: "Snoopy"}
        ]
      }
    ];
    
    const filtered = persons.filter(p => p.animals.filter(a => a.species === "cat").length > 0)
    
    console.log(filtered)

    0 讨论(0)
  • 2020-12-20 18:20

    You might want to use some'

     persons.filter(p => p.animals.some(s => s.species === 'cat'))
    
    0 讨论(0)
  • 2020-12-20 18:31

    This should work!

    const result = persons.filter(person => {
       let innerResult = person.animals.filter(animal => {
          return animal.species === 'cat';
       });
    
      return innerResult.length > 0;
    });
    
    0 讨论(0)
  • 2020-12-20 18:33

    You can use filter() with some() method to check if some of the objects in animals array has species == cat.

    const persons = [{"name":"Joe","animals":[{"species":"dog","name":"Bolt"},{"species":"cat","name":"Billy"}]},{"name":"Bob","animals":[{"species":"dog","name":"Snoopy"}]}]
    
    const result = persons.filter(({animals}) => {
      return animals.some(({species}) => species == 'cat')
    })
    
    console.log(result)

    0 讨论(0)
  • 2020-12-20 18:35

    const persons = [
      {
        name: "Joe",
        animals: [
          {species: "dog", name: "Bolt"},
          {species: "cat", name: "Billy"},
        ]
      },
      {
        name: "Bob",
        animals: [
          {species: "dog", name: "Snoopy"}
        ]
      }
    ];
    
    Filter = function(arr, a){
      return arr.filter(t=>t.animals.filter(y=>y.species==a).length>0);
    }
    
    console.log(Filter(persons, 'cat'))

    0 讨论(0)
提交回复
热议问题