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

如何用纯JavaScript将分组对象转换为数组的数组

把分组对象转换成数组数组的解决办法

你已经成功完成了数组按指定键值分组的步骤,现在只需要把分组对象里的所有值提取出来,组成一个新数组就可以达到你的需求啦!你之前尝试的[key].concat.split逻辑有问题,所以才会返回undefined,我来帮你修正并解释清楚。

最简洁的ES6+方案:使用Object.values()

这是现代JS里最直接的方式,Object.values()方法会直接返回对象所有属性值组成的数组,完美匹配你的需求:

var filter = [{ "Id": "120", "arrayPicklist": "Categorie__c" }, { "Id": "121", "arrayPicklist": "Regio__c" }, { "Id": "122", "arrayPicklist": "Categorie__c" }, { "Id": "123", "arrayPicklist": "Regio__c" }, { "Id": "121", "arrayPicklist": "Regio__c" } ]

function splitArrayByValue(arr, key) {
 var split = {};
 for (var i = 0; i < arr.length; i++) {
 var p = arr[i][key];
 if (!split[p]) {
 split[p] = [];
 }
 split[p].push(arr[i])
 }
 return split;
}

var buckets2 = splitArrayByValue(filter, 'arrayPicklist');
// 关键一步:提取对象的所有值组成目标数组
var result = Object.values(buckets2);
console.log(result);

运行后result就是你想要的格式:[[Regio__c对应的所有元素], [Categorie__c对应的所有元素]](ES6+环境下,数组顺序会和对象中键的插入顺序一致)。

兼容旧版JS的方案(不依赖ES6特性)

如果需要支持更老的浏览器或环境,可以手动遍历对象的键来收集值:

var result = [];
// 遍历分组对象的每个键
for (var groupKey in buckets2) {
  // 确保只处理对象自身的属性,避免原型链上的冗余属性
  if (buckets2.hasOwnProperty(groupKey)) {
    result.push(buckets2[groupKey]);
  }
}
console.log(result);

为什么你的尝试会返回undefined?

你之前写的return [key].concat.split有几个明显的问题:

  • split是你创建的对象,而concat是数组的方法,不能直接在对象上调用;
  • key是splitArrayByValue函数循环里的局部变量,函数执行结束后它的值是最后一个元素的arrayPicklist值,并不是所有分组键的集合;
  • 就算split是数组,concat.split的写法也是错误的,正确的数组concat用法应该是[key].concat(split),但这也不符合你要收集所有分组值的需求。

所以直接提取对象的所有属性值,才是实现你目标的正确路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:58:56