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

JS数组按key分组代码在Edge、IE中报错如何解决?

报错原因

  • IE浏览器报错:IE全版本不支持ES6及以上语法,你代码里用到的箭头函数、const声明、Array.prototype.find方法都不属于ES5标准,所以直接触发语法错误。
  • 旧版Edge(EdgeHTML内核,非Chromium版)报错:该版本未实现对象展开运算符{...curr}的语法支持,你已经用Object.assign的方案解决了该问题。

原实现性能评估

原实现不是最优方案,时间复杂度为O(n²):每次reduce遍历元素时,都会调用find遍历一次已处理的结果数组,数据量较大时性能损耗非常明显。
更优的实现是用哈希表存储已出现的id映射,将时间复杂度降低到O(n),同时还可以规避Array.prototype.find的兼容问题。

全兼容实现方案

你可以直接使用以下ES5标准的兼容代码,支持IE9及以上、所有版本Edge、Chrome、Firefox:

var d = [
  {"teamID":1,"name":"WMH ED Medics","id":1,"username":"WHT\\andrew.bones","lastLoggedIn":null,"archive":false,"forename":"andrew","surname":"bones","band":"Band 7","role":"Developer","competency":"Kicks","employeeNumber":"123"},
  // 其余数组项保持不变
];

function reduceJson(baseData,k) {
  // 用哈希表存储id和对应节点的映射,避免每次遍历查找
  var idMap = {};
  var newData = [];
  for (var i = 0; i < baseData.length; i++) {
    var curr = baseData[i];
    if (idMap[curr.id]) {
      idMap[curr.id][k].push(curr[k]);
    } else {
      // 兼容低版本浏览器的对象拷贝,替代Object.assign和对象展开
      var newNode = {};
      for (var key in curr) {
        if (curr.hasOwnProperty(key)) {
          newNode[key] = curr[key];
        }
      }
      newNode[k] = [curr[k]];
      idMap[curr.id] = newNode;
      newData.push(newNode);
    }
  }
  return newData;
}
console.log(reduceJson(d,"name"))

如果你的项目有引入polyfill,也可以保留reduce的写法,只替换箭头函数、const和对象展开部分即可。

内容的提问来源于stack exchange,提问作者pee2pee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:57:04