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

第一个帖子!


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


我有一个对象数组:


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、find 的各种组合,例如


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

但这也返回了爱丽丝的鱼和克里斯的驴——我只想要猫。我已经成功地把自己弄糊涂了,我只是找不到正确的调用来让我的爱猫者和他们的猫,我已经为这个“简单”的问题苦苦挣扎了几个小时了……

所以我的问题是“我如何达到这个预期的结果?”


一只名叫tom的猫
浏览 280回答 3
3回答

红糖糍粑

这会有所帮助kids.filter((x) => x.pets.filter((y) => y.type === 'cat').length > 0);

慕田峪9158850

疯狂的单线,有点工作: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),然后过滤掉空记录”。可能会添加格式以提高可读性,但在那之后它不会是单行的:)

qq_花开花谢_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);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript