如何用纯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
相关产品推荐
相关产品推荐

