Javascript 在具有不同值的对象数组(即数组)中查找对象的最有效方法是什么?
我最初是在几个月前的一次采访中得到这个问题的&现在我已经开始着手解决这个问题了 所以我们有了这个对象数组&目标是找到一个包含演员的对象,这些演员在一部电影中只出现过一次。所以基本上找一部有独特演员的电影Javascript 在具有不同值的对象数组(即数组)中查找对象的最有效方法是什么?,javascript,arrays,functional-programming,computer-science,Javascript,Arrays,Functional Programming,Computer Science,我最初是在几个月前的一次采访中得到这个问题的&现在我已经开始着手解决这个问题了 所以我们有了这个对象数组&目标是找到一个包含演员的对象,这些演员在一部电影中只出现过一次。所以基本上找一部有独特演员的电影 [ { 名字:'黑暗骑士', 评级:“PG-13”, 年份:2012年, 最佳场景:{ 名字:“战斗”, 地点:'下水道', 场景长度:10, 演员:[“克里斯蒂安·贝尔”、“汤姆·哈代”] } }, { 名字:“好汉堡”, 评级:“PG”, 年份:1994年, 最佳场景:{ 名称:'跳跃',
[
{
名字:'黑暗骑士',
评级:“PG-13”,
年份:2012年,
最佳场景:{
名字:“战斗”,
地点:'下水道',
场景长度:10,
演员:[“克里斯蒂安·贝尔”、“汤姆·哈代”]
}
},
{
名字:“好汉堡”,
评级:“PG”,
年份:1994年,
最佳场景:{
名称:'跳跃',
地点:“巨型奶昔”,
场景长度:5,
演员:[“凯南·汤普森”、“凯尔·米切尔”]
}
},
{
名称:'沙克纳多2:第二个',
收视率:"TV-14",,
年份:2013年
},
{
名称:'大短',
评级:‘R’,
年份:2015年,
最佳场景:{
名称:'解释',
地点:'赌场',
场景长度:20,
演员:['Christian Bale'、'Steve Carrell']
}
}
]
我为自己设定的一个目标是使用函数方法解决它,因此我们自然需要剔除没有bestScene
的对象,如下所示:
const moviesWithActorsPresent = movies.filter((movie) => movie.bestScene)
[
{ 'The Dark Knight': [ 'Christian Bale', 'Tom Hardy' ] },
{ 'Good Burger': [ 'Kenan Thompson', 'Kel Mitchell' ] },
{ 'The Big Short': [ 'Christian Bale', 'Steve Carrell' ] }
]
然后,我可以使用reduce
构建如下对象数组:
const moviesWithActorsPresent = movies.filter((movie) => movie.bestScene)
[
{ 'The Dark Knight': [ 'Christian Bale', 'Tom Hardy' ] },
{ 'Good Burger': [ 'Kenan Thompson', 'Kel Mitchell' ] },
{ 'The Big Short': [ 'Christian Bale', 'Steve Carrell' ] }
]
然后使用for
或forEach
&在临时变量中跟踪参与者,但这对我来说并不是一个完美的解决方案
我们可以在这里使用什么样的CS概念来有效地解决这个问题?一旦您有了
moviesWithActorsPresent
,创建一个对象(或贴图),计算整个数组中每个角色的出现次数。然后您可以。找到一个对象,该对象的。每个参与者的计数正好为1:
const电影=[
{
名字:'黑暗骑士',
评级:“PG-13”,
年份:2012年,
最佳场景:{
名字:“战斗”,
地点:'下水道',
场景长度:10,
演员:[“克里斯蒂安·贝尔”、“汤姆·哈代”]
}
},
{
名字:“好汉堡”,
评级:“PG”,
年份:1994年,
最佳场景:{
名称:'跳跃',
地点:“巨型奶昔”,
场景长度:5,
演员:[“凯南·汤普森”、“凯尔·米切尔”]
}
},
{
名称:'沙克纳多2:第二个',
收视率:"TV-14",,
年份:2013年
},
{
名称:'大短',
评级:‘R’,
年份:2015年,
最佳场景:{
名称:'解释',
地点:'赌场',
场景长度:20,
演员:['Christian Bale'、'Steve Carrell']
}
}
];
const movieswithactors present=movies.filter((movie)=>movie.bestScene)
const-actorCounts=movieswithactorpresent.reduce((a,{bestScene})=>{
const{actors}=最佳场景;
返回Object.assign(
{},//不要变异
a、 //以前的计数
…actors.map(actor=>({[actor]:(a[actor]| | 0)+1}))
);
}, {});
const movieWithUniqueActors=movieswithactors present.find({bestScene})=>(
bestScene.actors.every(actor=>actorCounts[actor]==1)
));
控制台日志(具有唯一演员的电影)
您只需创建一个函数,将电影按演员分组,然后只拍摄那些有1
电影的电影
const group=(数据)=>data
.reduce((res,{name,bestScene})=>{
((最佳场景| |{}).actors | |[]).forEach(actor=>{
res[actor]=(res[actor]| |[])。concat(名称);
});
返回res;
}, {});
const solve=data=>Object
.条目(组(数据))
.filter(([作者,电影])=>films.length==1)
常数数据=[
{
名字:'黑暗骑士',
评级:“PG-13”,
年份:2012年,
最佳场景:{
名字:“战斗”,
地点:'下水道',
场景长度:10,
演员:[“克里斯蒂安·贝尔”、“汤姆·哈代”]
}
},
{
名字:“好汉堡”,
评级:“PG”,
年份:1994年,
最佳场景:{
名称:'跳跃',
地点:“巨型奶昔”,
场景长度:5,
演员:[“凯南·汤普森”、“凯尔·米切尔”]
}
},
{
名称:'沙克纳多2:第二个',
收视率:"TV-14",,
年份:2013年
},
{
名称:'大短',
评级:‘R’,
年份:2015年,
最佳场景:{
名称:'解释',
地点:'赌场',
场景长度:20,
演员:['Christian Bale'、'Steve Carrell']
}
}
];
console.log(解析(数据))
我想我把解决方案复杂化了,直到每个。使用filter然后reduce在数组上循环两次可能比在回调中对bestScene执行reduce和filtering效率更低。