JS(ES6):基于嵌套数组属性的过滤器数组

时间:2018-03-14 14:53:59

标签: javascript arrays filter ecmascript-6

我有一个数组,如下所示:

const persons = [
  {
    name: "Joe",
    animals: [
      {species: "dog", name: "Bolt"},
      {species: "cat", name: "Billy"},
    ]
  },
  {
    name: "Bob",
    animals: [
      {species: "dog", name: "Snoopy"}
    ]
  }
];

现在我想根据物种进行过滤。 例如:每个有猫的人都应该被退回:

const result = [
  {
    name: "Joe",
    animals: [
      {species: "dog", name: "Bolt"},
      {species: "cat", name: "Billy"},
    ]
  }
];

我尝试过这样的filter()方法:

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

但这不会返回所需的结果(它会返回两个人)。

如何在嵌套数组的属性上过滤数组?

7 个答案:

答案 0 :(得分:11)

你的内部过滤器仍然会返回一个" truthy"狗人的价值(空数组)。添加.length,以便结果不会变为0(" falsey")

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

编辑:根据评论和其他几个答案,由于目标是从内部循环中获取真值,.some会更好地完成工作,因为它直接返回true如果有任何项目匹配。

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

答案 1 :(得分:2)

您可能想要使用一些'

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

答案 2 :(得分:1)



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'))




答案 3 :(得分:0)

您可以使用filter()some()方法检查动物数组中的某些对象是否有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)

答案 4 :(得分:0)

这应该可以解决问题

persons.filter((person) => {
    return person.animals.filter((animal) => {
        return animal.species === 'cat';
    }).length > 0;
});

添加长度检查,因为过滤器返回一个数组,而不是布尔值。

答案 5 :(得分:0)

您没有检查第二个过滤器的长度。

Filer仅包含返回true值的结果。所以我们需要为第二个过滤器提供一种如果找到某些东西则返回true的方法。我们可以这样说,如果返回的数组是> 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)




答案 6 :(得分:0)

这应该有效!

const result = persons.filter(person => {
   let innerResult = person.animals.filter(animal => {
      return animal.species === 'cat';
   });

  return innerResult.length > 0;
});