【问题标题】:JS (ES6): Filter array based on nested array attributesJS(ES6):基于嵌套数组属性过滤数组
【发布时间】:2018-08-23 04:03:23
【问题描述】:

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

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

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

如何根据嵌套数组的属性过滤数组?

【问题讨论】:

标签: javascript arrays filter ecmascript-6


【解决方案1】:

您的内部过滤器仍会为狗人返回一个“真实”值(空数组)。添加.length,这样没有结果就变成0("falsey")

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

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

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

【讨论】:

    【解决方案2】:

    你可能想用一些'

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您可以使用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)

        【讨论】:

          【解决方案5】:

          这应该可以解决问题

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

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

          【讨论】:

            【解决方案6】:

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

            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)

            【讨论】:

              【解决方案7】:

              这应该可行!

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-09-29
                • 2016-11-17
                • 2021-08-04
                • 1970-01-01
                • 2016-11-03
                • 1970-01-01
                • 2020-07-04
                • 2021-03-13
                相关资源
                最近更新 更多