如何按id对JSON数组分组,将同id元素归类为独立子数组?
实现方案
适配已排序输入的高效实现
由于你明确输入数组已经完成排序,相同id的元素是连续排列的,仅需一次遍历即可完成分组,无额外存储空间开销,时间复杂度O(n):
function groupById(sortedArray) { // 空数组直接返回 if (!sortedArray.length) return []; const result = []; // 初始化第一组 let currentGroup = [sortedArray[0]]; let currentId = sortedArray[0].id; // 从第二个元素开始遍历 for (let i = 1; i < sortedArray.length; i++) { const item = sortedArray[i]; if (item.id === currentId) { // id相同,加入当前分组 currentGroup.push(item); } else { // id不同,存入当前分组,重置分组状态 result.push(currentGroup); currentGroup = [item]; currentId = item.id; } } // 存入最后一组 result.push(currentGroup); return result; }
测试示例
使用你提供的输入数据测试:
const input = [ { "id": "116621", "field": "list18", "line": 0, "value": "6", "changeOrder": 5 }, { "id": "116621", "field": "list16", "line": 0, "value": "47", "changeOrder": 4 }, { "id": "116621", "field": "list17", "line": 0, "value": "3", "changeOrder": 2 }, { "id": "116622", "field": "list16", "line": 1, "value": "6", "changeOrder": 3 }, { "id": "116623", "field": "list18", "line": 2, "value": "11", "changeOrder": 6 }, { "id": "116623", "field": "list16", "line": 2, "value": "5", "changeOrder": 1 } ]; const groupedResult = groupById(input); console.log(groupedResult);
输出格式完全符合你的要求,相同id的元素会被归到同一个子数组中。
通用未排序输入实现
如果后续你的业务场景中输入数组不再保证排序,可以使用如下哈希表分组方案:
function groupByIdUnordered(array) { const groupMap = {}; array.forEach(item => { if (!groupMap[item.id]) groupMap[item.id] = []; groupMap[item.id].push(item); }); // 返回子数组格式的结果,如果需要保留id为key的映射关系可直接返回groupMap return Object.values(groupMap); }
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

