Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在具有不同值的对象数组(即数组)中查找对象的最有效方法是什么?_Javascript_Arrays_Functional Programming_Computer Science - Fatal编程技术网

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效率更低。