第一篇文章!
我已经进行了一些搜索,找到并尝试了一些与我的问题很接近的答案,但是没有一个完全匹配。
我有一个对象数组:
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
})
此代码有效,我很高兴,也很困惑。
我意识到有多种方法可以给猫咪剥皮,而且我还没有尝试以下建议的答案。
再次感谢
答案 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),然后过滤掉空记录”。
可能已添加格式以提高可读性,但此后将不再是一:而就了:)