Javascript 如何访问通过.reduce()传递的数组
我有一个JavaScript对象:Javascript 如何访问通过.reduce()传递的数组,javascript,arrays,reduce,Javascript,Arrays,Reduce,我有一个JavaScript对象: const电影=[ {'title':'Inception','rating':8.8}, {'title':'interstallar','rating':8.6}, {'title':'The Dark Knight','rating':9.0}, {'title':'Batman Begins','rating':8.3} ] 例如,我想做的是使用.reduce()计算平均评级,所以我被困在这里: const averageRating=movies.
const电影=[
{'title':'Inception','rating':8.8},
{'title':'interstallar','rating':8.6},
{'title':'The Dark Knight','rating':9.0},
{'title':'Batman Begins','rating':8.3}
]
例如,我想做的是使用.reduce()
计算平均评级,所以我被困在这里:
const averageRating=movies.filter(movie=>movie['rating']>8.5)。减少((acc,movie)=>(acc+movie['rating'])/2,/*此数组第一个值的评级*/)
如何访问由reduce()
处理的数组以获取第一个电影的评级(使用它的第一个元素.rating作为初始值)?我知道默认情况下分配给acc
的第一个值是第一个值,但在本例中它是一个对象
我知道有更好的方法来解决这个特殊情况,我实际上已经解决了,但我不知道我是否可以通过这种方法达到同样的结果
const电影=[{
'标题':'起始',
“评级”:8.8
},
{
“标题”:“星际”,
“评级”:8.6
},
{
“头衔”:“黑暗骑士”,
“评级”:9.0
},
{
“标题”:“蝙蝠侠开始”,
“评级”:8.3
}
]
const averageRating=movies.filter(movie=>movie['rating']>8.5)。reduce((acc,movie)=>(acc+movie['rating'])/2,)
console.log(averageRating)
的第四个参数是传递给它的数组
将累加器的初始值设置为0
——这将防止reduce在数组为空时抛出错误。将每个数字除以过滤数组的长度,并将结果添加到累加器中以获得平均值
const movies=[{“title”:“盗梦空间”,“imdbRating”:8.8},{“title”:“星际”,“imdbRating”:8.6},{“title”:“黑暗骑士”,“imdbRating”:9},{“title”:“蝙蝠侠开始”,“imdbRating”:8.3}]
常数平均=电影
.filter(movie=>movie.imdbRating>8.5)
.reduce((acc,movie,i,arr)=>acc+movie.imdbRating/arr.length,0)
console.log(平均值)
完整的.reduce
签名是:
arr.reduce(回调(累加器,当前值,[,索引[,数组]])[,初始值])
const averageRating=电影
.filter((电影)=>电影[“分级”]>8.5)
.reduce((acc,movie,index,array)=>(acc+movie[“rating”])/array.length,0);
并且可以访问reduce函数中的数组
查阅,您可以看到reduce
的回调具有以下签名
function(accumulator, currentValue, currentIndex, array)
因此
如果您注意到reduce
函数的参数,它接受四个参数
const averageRating=电影
.filter(电影=>movie['rating']>8.5)
.reduce((acc、电影、idx、arr)=>(acc+电影[‘评级])/2)
啊,好的,试试这个
const电影=[
{'title':'Inception','rating':8.8},
{'title':'interstallar','rating':8.6},
{'title':'The Dark Knight','rating':9.0},
{'title':'Batman Begins','rating':8.3}
]
//在每次修改对象属性时,
//不是数组值。要计算平均值,请添加acc评级
//当当前迭代等于
//数组长度(上一次迭代)除以累积值
//按数组长度(累计的条目数)。
const averageRating=movies.filter(movie=>movie['rating']>8.5)
.reduce((acc、电影、i、a)=>({
‘评级’:(根据评级+电影评级)/(i+1==a.length?a.length:1)
}));
console.log(平均值)代码>减少传递累加器和当前值,但未传递原始数组。您希望得到什么结果?我希望acc的initialValue是由Reduce处理的第一个元素的等级。我希望在initialValue参数中使用该数组,而不是在回调函数中使用该数组。当您仅除以当前项的等级时,它会起作用,而不是像您那样求和。只需运行代码段。数学很简单(x+y+z)/3=x/3+y/3+z/3。例如,有没有办法将累加器的初始值设置为第二个元素的额定值?为什么?如果过滤后的数组只有一个元素或根本没有元素,会发生什么?将此设置为0将确保无论有多少项,它都能工作。确定!谢谢你……这很有效!,但我真的不明白这段代码是如何工作的好,是哪一部分?关于累加对象属性或关于计算平均值?累加对象属性,基本上是在每次reduce迭代中修改对象属性,因为累加的不是数组值,而是数组中的对象,所以使用({'rating':acc.rating+movie.rating})
。但是您不仅要累加它们,还要计算平均值,所以您将其包装为:({'rating':(acc.rating+movie.rating)/(i+1==a.length?a.length:1)}
-将acc.rating
添加到当前movie.rating
以及当前迭代等于数组长度时(上次迭代)将累计值除以数组长度(累计的条目数)。
array
.filter(x => ...)
.reduce((ac, cv, i, ar) => {
//here ar is the array you are calling reduce, ie the array resulting from filter
})