Javascript 筛选与第二个数组中的值匹配的对象数组
在我的react应用程序中,我有如下用户:Javascript 筛选与第二个数组中的值匹配的对象数组,javascript,arrays,reactjs,object,filter,Javascript,Arrays,Reactjs,Object,Filter,在我的react应用程序中,我有如下用户: { username: 'admin', genres: [{name: 'Music', id: 1}, {name: 'Art', id: 2}] } { title: 'cool video', genres: [{name: 'Music', id: 1}, {name: 'Technology', id: 3}] } 还有像这样的视频: { username: 'admin', genres: [{name: 'Music', id: 1
{ username: 'admin', genres: [{name: 'Music', id: 1}, {name: 'Art', id: 2}] }
{ title: 'cool video', genres: [{name: 'Music', id: 1}, {name: 'Technology', id: 3}] }
还有像这样的视频:
{ username: 'admin', genres: [{name: 'Music', id: 1}, {name: 'Art', id: 2}] }
{ title: 'cool video', genres: [{name: 'Music', id: 1}, {name: 'Technology', id: 3}] }
我正在尝试编写一个函数,该函数将返回一个视频对象数组,其中包含单个用户中的任何类型。到目前为止,我已经能够硬编码一个解决方案,但如果用户有错误的流派数量,它就会中断,所以我正在寻找一个更整洁的解决方案。这就是我到目前为止所做的:
function filterVideos() {
const userGenres = []
user.genres.forEach(genre => {
userGenres.push(genre.name)
})
const filteredVideos = videos.filter(video => {
return video.genres.find(o => o.name === userGenres[0])
|| video.genres.find(o => o.name === userGenres[1])
|| video.genres.find(o => o.name === userGenres[2])
})
return filteredVideos}
您可以在过滤器中使用some()
const filteredVideos = videos.filter(video => user.genres.some(gen => gen.name === video.name))
const user={username:'admin',流派:[{name:'Music',id:1},{name:'Art',id:2}]}
const video={title:'cool video',类型:[{name:'Music',id:1},{name:'Technology',id:3}]};
const res=video.genres.filter(v=>user.genres.some(g=>g.name==v.name));
console.log(res)
如果我理解您的问题,您希望返回一个完整视频对象的过滤数组,这些对象至少有一种类型与传递的用户相同
您可以使用单个map()
调用将用户的流派数组简化为流派名称数组
const userGenres = user.genres.map(({name}) => name);
然后,使用确定是否有任何视频类型包含在userGenres
数组中
const user={
用户名:“admin”,
类型:[{name:'Music',id:1},{name:'Art',id:2}]}
常量视频=[
{
标题:“视频1”,
类型:[{name:'Music',id:1},{name:'Technology',id:3}]
},
{
标题:“视频2”,
类型:[{name:'Art',id:1},{name:'Technology',id:3}]
},
{
标题:“视频3”,
类型:[{name:'Sports',id:1},{name:'Technology',id:3},{name:'skilling',id:3}]
}
]
功能过滤器(用户、视频){
const userGenres=user.genres.map(({name})=>name);
返回视频。过滤器(视频=>(
video.genres.some({name})=>userGenres.includes(name))
));
}
日志(filterVideos(用户、视频))
您可以使用id
而不是name
。我想可能会更好idea@AlexeyZelenin你的观点是正确的,但操作要求是比较名称
你确定用户
部分吗?因为我认为他有一系列用户
而不是一个用户
对象?@AlanOmar我也在想,但他还没有提到任何东西。我刚把他的电脑改造成更简单的。让我们看看OP的反应如何谢谢大家的反应!我认为id或名称是可行的,但我希望返回整个视频对象,就像在Pilchard的解决方案中一样!(我可能没有很好地解释我自己!)不过我真的很感谢你的帮助!:)这回答了你的问题吗?传奇非常感谢你!它工作得很好!