JavaScript:如何处理类数组对象大键名并计算子数组平均分
解决超大索引数组/对象的子数组平均分计算问题
首先纠正核心误区:你遇到的问题和键名数值大小无关,是数据结构使用错误导致的。
情况1:你的数据是对象(如提供的示例)
你给出的results是键为字符串数字的对象,不是数组。之前用for (let i = 0; i < array.length; i++)的方式完全不适用——对象没有length属性,这种循环逻辑本身就是错的。
直接用Object.values()提取所有子数组,再遍历计算即可:
const results = { "18456": [ {id: 1767, data: "blabla", score: 50, date:'2022-08-02T12:25:00.000Z'}, {id: 1766, data: "blabla", score: 70, date: '2022-08-02T12:24:00.000Z'}, {id: 1765, data: "blabla", score: 68, date: '2022-08-02T12:23:00.000Z'}, {id: 1764, data: "blabla", score: 13, date: '2022-08-02T12:22:00.000Z'} ], "19212": [ {id: 1763, data: "blabla", score: 20, date: '2022-07-15T12:25:00.000Z'}, {id: 1762, data: "blabla", score: 75, date: '2022-07-15T12:25:00.000Z'}, {id: 1761, data: "blabla", score: 80, date: '2022-07-15T12:25:00.000Z'}, {id: 1760, data: "blabla", score: 53, date: '2022-07-15T12:25:00.000Z'} ], "19219": [ {id: 1763, data: "blabla", score: 100, date: '2022-07-07T12:25:00.000Z'}, {id: 1762, data: "blabla", score: 69, date: '2022-07-07T12:25:00.000Z'}, {id: 1761, data: "blabla", score: 32, date: '2022-07-07T12:25:00.000Z'}, {id: 1760, data: "blabla", score: 58, date: '2022-07-07T12:25:00.000Z'} ] }; // 计算平均分的函数 const getAverageScores = (data) => { // 提取所有子数组,无需关心键名 return Object.values(data).map(group => { // 求和 const total = group.reduce((sum, item) => sum + item.score, 0); // 计算平均分并保留两位小数 const avg = (total / group.length).toFixed(2); // 取分组的日期(按示例取第一个元素的日期) const date = group[0].date; return { averageScore: `${avg}%`, date }; }); }; // 执行并输出 const result = getAverageScores(results); console.log(result);
情况2:你的数据是超大索引数组
如果原始数据是数组,且用array[18456] = [...]这种方式赋值,会导致数组长度被拉到18457,其中0到18455都是空元素。遍历整个数组会处理大量空值,直接导致性能崩溃。
这种情况下先过滤出有效子数组:
// 假设你的超大数组是bigArray const validGroups = bigArray.filter(item => item !== undefined); // 直接计算平均分 const result = validGroups.map(group => { const total = group.reduce((sum, item) => sum + item.score, 0); const avg = (total / group.length).toFixed(2); const date = group[0].date; return { averageScore: `${avg}%`, date }; });
关键提示
- 不要用大数字作为数组索引,这种场景用对象存储键值对更合理
- 遍历对象优先用
Object.values()/Object.entries(),避免手动处理键名 - 处理数组时先过滤空元素,避免无效遍历
内容的提问来源于stack exchange,提问作者Momo
相关产品推荐
相关产品推荐

