Javascript 如何访问通过.reduce()传递的数组

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.

我有一个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.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
      })