You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 17:25:51