如何对存储剧集信息的二维数组按剧集名称分组并计算平均评分
如何对存储剧集信息的二维数组按剧集名称分组并计算平均评分
我完全懂你的需求!你已经用reduce完成了评分累加的第一步,但确实漏掉了统计每个剧集出现次数的环节,所以没法算出平均分。我来帮你调整代码,完美解决这个问题~
问题分析
你当前的代码直接把同剧集的评分累加后覆盖了原条目,但没有记录评分的次数,自然没法计算平均值。而且现在的代码还保留了第一次出现的观看时长,从你的预期结果来看,这个逻辑是对的,我们可以继续沿用。
修改后的解决方案
我们需要在reduce的累加器里临时存储每个剧集的总评分、评分次数和观看时长,最后再把这些临时数据转换成你需要的二维数组格式:
let seriesList = [["Squid Game", 3.5, "4 days"], ["Squid Game", 2.5, "3 days"], ["Buffy the Vampire Slayer", 5, "32 days"], ["The Fosters", 3, "5 days"]]; let seriesListAverage = Object.values( seriesList.reduce((accumulator, currentValue) => { // 解构当前条目的数据,让代码更清晰 const [title, rating, time] = currentValue; if (accumulator[title]) { // 如果该剧集已经在累加器中,更新总评分和次数 accumulator[title].totalRating += rating; accumulator[title].count += 1; } else { // 如果是第一次遇到该剧集,初始化临时存储的对象 accumulator[title] = { title: title, totalRating: rating, count: 1, time: time }; } return accumulator; }, {}) ).map(tempItem => { // 计算平均分,转换成目标二维数组格式 const averageRating = tempItem.totalRating / tempItem.count; // 可选:如果需要固定小数位数,比如保留1位,可以用下面的写法 // const averageRating = Number((tempItem.totalRating / tempItem.count).toFixed(1)); return [tempItem.title, averageRating, tempItem.time]; }); console.log(seriesListAverage); // 输出结果:[["Squid Game", 3, "4 days"], ["Buffy the Vampire Slayer", 5, "32 days"], ["The Fosters", 3, "5 days"]]
额外说明
- 小数位数处理:如果需要对平均分做格式化(比如保留1位小数),可以用
toFixed(1),但注意它会返回字符串,需要用Number()转成数字类型。 - 观看时长的选择:当前代码保留的是剧集第一次出现的时长,如果需要保留最后一次的,只需要把
else分支里的time: time去掉,改成每次遍历都执行accumulator[title].time = time即可。 - Apps Script兼容性:这段代码完全适配Google Apps Script的环境,生成的二维数组可以直接写入到你的工作表中,和你原来的写入逻辑无缝衔接。
备注:内容来源于stack exchange,提问作者amy
相关产品推荐
相关产品推荐

