
本文介绍如何根据嵌套数组中指定索引(如首项)的值,将二维数组高效分组为多个独立数组,并提供现代 API(Object.groupBy)与兼容性方案(自定义 groupBy)两种实现方式。
本文介绍如何根据嵌套数组中指定索引(如首项)的值,将二维数组高效分组为多个独立数组,并提供现代 api(`object.groupby`)与兼容性方案(自定义 `groupby`)两种实现方式。
在 JavaScript 开发中,经常需要对多维数组按某一项的值进行分类聚合。例如,给定一个表示设备状态的二维数组:
const mixedArray = [ ["online", "abc", "def"], ["offline", "ghi", "jkl"], ["online", "mno", "pqr"], ["offline", "stu", "vwx"] ];
目标是将其按首项(即索引 0 处的字符串 "online" 或 "offline")拆分为两个独立数组:
const array1 = [["online","abc","def"],["online","mno","pqr"]]; const array2 = [["offline","ghi","jkl"],["offline","stu","vwx"]];
✅ 推荐方案:使用 Object.groupBy()(现代浏览器 & Node.js ≥20.1)
Object.groupBy() 是 ECMAScript 新增的标准方法,专为按键分组设计,语法简洁、语义清晰:
const mixedArray = [
["online", "abc", "def"],
["offline", "ghi", "jkl"],
["online", "mno", "pqr"],
["offline", "stu", "vwx"]
];
// 按每项的第 0 个元素(即状态字符串)分组
const { online, offline } = Object.groupBy(mixedArray, ([status]) => status);
console.log(online); // [["online","abc","def"], ["online","mno","pqr"]]
console.log(offline); // [["offline","ghi","jkl"], ["offline","stu","vwx"]]
? 技术说明:
([status]) => status是数组解构参数,直接提取子数组首项作为分组键;Object.groupBy返回形如{ online: [...], offline: [...] }的对象,再通过解构赋值获取所需变量。
Alibabacloud Sdk Client Initialization For Java下载在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
✅ 优势:原生、可读性强、无需额外依赖;
⚠️ 注意:需确保运行环境支持(Chrome 117+、Firefox 120+、Safari 17.4+,或使用 core-js polyfill)。
? 兼容方案:手写 groupBy 函数(支持所有环境)
若需兼容旧版浏览器或 Node.js groupBy 工具函数:
function groupBy(array, keyFn) {
const result = Object.create(null);
let index = 0;
for (const item of array) {
const key = keyFn(item, index++);
if (key in result) {
result[key].push(item);
} else {
result[key] = [item];
}
}
return result;
}
// 使用示例
const mixedArray = [
["online", "abc", "def"],
["offline", "ghi", "jkl"],
["online", "mno", "pqr"],
["offline", "stu", "vwx"]
];
const { online, offline } = groupBy(mixedArray, ([status]) => status);
console.log(online); // 同上
console.log(offline); // 同上
该实现严格遵循 TC39 规范草案,支持任意键生成函数(如 ([a, b, c]) => b 可按第二项分组),且返回对象属性为 null 原型链,避免原型污染风险。
? 扩展提示
- 若需动态获取分组结果(如未知键名),可用
Object.values()或Object.entries()遍历:const groups = Object.groupBy(mixedArray, ([s]) => s); const allGroups = Object.values(groups); // [[...online...], [...offline...]]
- 分组键支持任意类型(字符串、数字、Symbol),但不推荐直接用对象/数组作键(会转为
"[object Object]"); - 如需保持原始顺序或去重,可在分组后额外处理(如
Array.from(new Set(...)))。
掌握这两种方式,即可灵活应对各类嵌套数组按索引归类需求,兼顾代码可维护性与环境兼容性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











