javascript过滤数组内部对象中的数组

时间:2019-10-24 15:56:00

标签: javascript filter

第一篇文章!

我已经进行了一些搜索,找到并尝试了一些与我的问题很接近的答案,但是没有一个完全匹配。

我有一个对象数组:

const kids = [
  { name: 'alice', 
    age: 13, 
    pets: [
      { type: 'fish', pet_name: 'nemo' },
      { type: 'cat', pet_name: 'snuffles'},
      { type: 'cat', pet_name: 'pixel'}
    ]
  },
  { name: 'bob', 
    age: 7,
    pets: [
      { type: 'dog', pet_name: 'rover' }
    ] 
  },
  { name: 'chris',
    age: 15,
    pets: [
      { type: 'cat', pet_name: 'fluffy' },
      { type: 'donkey', pet_name: 'eeyore' }
    ]
  }
]

我想让所有拥有猫的孩子都使用高阶函数而不是循环。 我想要的结果是

cat_owners = [ 
              { name: 'alice', age: 13, 
                pets: [ { type: 'cat', pet_name: 'snuffles' },
                        { type: 'cat', pet_name: 'pixel' } ]
              },
              { name: 'chris', age: 15, 
                pets: [ {  type: 'cat', pet_name: 'fluffy' } ] } 
            ]

我尝试过过滤器的各种组合,例如forEach,查找

const cat_owners = kids.filter(kid => kid.pets.find(pet => pet.type === 'cat') )

const kids = [
  { name: 'alice', 
    age: 13, 
    pets: [
      { type: 'fish', pet_name: 'nemo' },
      { type: 'cat', pet_name: 'snuffles'},
      { type: 'cat', pet_name: 'pixel'}
    ]
  },
  { name: 'bob', 
    age: 7,
    pets: [
      { type: 'dog', pet_name: 'rover' }
    ] 
  },
  { name: 'chris',
    age: 15,
    pets: [
      { type: 'cat', pet_name: 'fluffy' },
      { type: 'donkey', pet_name: 'eeyore' }
    ]
  }
];

const cat_owners = kids.filter(kid => kid.pets.find(pet => pet.type === 'cat'));

console.log(cat_owners);

但这还会返回爱丽丝的鱼和克里斯·驴-我只想要猫。 我已经设法愚弄自己,只是找不到合适的方法来吸引我的恋人和他们的猫,我已经为这个“简单的”问题苦苦挣扎了两个小时……

所以我的问题是“我如何实现这个理想的结果?”

预先感谢

...

编辑:

感谢所有回答。 我设法在重复答案的帮助下做到了。 我必须首先为孩子过滤pet_type =='cat',然后将每个孩子映射到newKid(如果他们有猫),然后再次按pet_type过滤:

const cat_owners = kids.filter(
                     kid => kid.pets.some(pet => pet.type === 'cat')
                   )
                  .map(kid => {
                    let newKid = Object.assign( {}, kid )
                    newKid.pets = newKid.pets.filter(pet => pet.type == 'cat')
                    return newKid
                  })

此代码有效,我很高兴,也很困惑。

我意识到有多种方法可以给猫咪剥皮,而且我还没有尝试以下建议的答案。

再次感谢

3 个答案:

答案 0 :(得分:0)

这会有所帮助


kids.filter((x) => x.pets.filter((y) => y.type === 'cat').length > 0);

答案 1 :(得分:0)

如果我清楚地了解,您只希望有猫的孩子,但在宠物清单中只希望猫。

这是我的建议:

const kids = [
  { name: 'alice', 
    age: 13, 
    pets: [
      { type: 'fish', pet_name: 'nemo' },
      { type: 'cat', pet_name: 'snuffles'},
      { type: 'cat', pet_name: 'pixel'}
    ]
  },
  { name: 'bob', 
    age: 7,
    pets: [
      { type: 'dog', pet_name: 'rover' }
    ] 
  },
  { name: 'chris',
    age: 15,
    pets: [
      { type: 'cat', pet_name: 'fluffy' },
      { type: 'donkey', pet_name: 'eeyore' }
    ]
  }
];

const owners = [];
const type = 'cat';

kids.forEach(kid => {
  kid.pets = kid.pets.filter(pet => pet.type === type);
  if (kid.pets.length)
  	return owners.push(kid);
});

console.log(owners);

答案 2 :(得分:0)

疯狂的一线客,那有点奏效:

const catLovers = kids.map(k => k.pets.some(p => p.type === 'cat') ? {...k, pets: k.pets.filter(p => p.type === 'cat')} : null).filter(k => k)

它实现以下算法:“对于每个至少有一只猫的孩子,创建只包含猫的新数组记录(否则为null),然后过滤掉空记录”。

可能已添加格式以提高可读性,但此后将不再是一:而就了:)