如何按continent字段拆分含多对象的数组为多个子数组
按continent字段拆分对象数组的解决方案
没问题!要把包含多个对象的数组按continent字段分组拆分,用JavaScript的Array.reduce()是最高效简洁的方式,我给你具体演示:
第一步:准备原始数组
假设我们有这样的原始数据:
const originalArray = [ { name: 'Paris', continent: 'Europe' }, { name: 'Beijing', continent: 'Asia' }, { name: 'London', continent: 'Europe' }, { name: 'Tokyo', continent: 'Asia' }, { name: 'New York', continent: 'North America' }, { name: 'Sydney', continent: 'Oceania' } ];
第二步:用reduce进行分组
我们可以通过reduce遍历数组,把每个对象按continent归类到对应的数组中:
// 先得到以continent为键的分组对象 const groupedObj = originalArray.reduce((accumulator, currentItem) => { // 提取当前对象的continent字段 const continent = currentItem.continent; // 如果当前continent还没在累加器里,就初始化一个空数组 if (!accumulator[continent]) { accumulator[continent] = []; } // 把当前对象push到对应的数组里 accumulator[continent].push(currentItem); // 返回累加器继续迭代 return accumulator; }, {}); // 初始值是一个空对象
执行这段代码后,groupedObj的结构会是这样:
{ Europe: [ { name: 'Paris', continent: 'Europe' }, { name: 'London', continent: 'Europe' } ], Asia: [ { name: 'Beijing', continent: 'Asia' }, { name: 'Tokyo', continent: 'Asia' } ], North America: [ { name: 'New York', continent: 'North America' } ], Oceania: [ { name: 'Sydney', continent: 'Oceania' } ] }
第三步:(可选)转换为子数组的数组
如果你想要的是一个包含所有分组子数组的数组(比如每个元素带continent标识),可以再用Object.entries()和map()转换:
const groupedArray = Object.entries(groupedObj).map(([continent, items]) => ({ continent, items }));
最终groupedArray的结果会是:
[ { continent: 'Europe', items: [ { name: 'Paris', continent: 'Europe' }, { name: 'London', continent: 'Europe' } ] }, { continent: 'Asia', items: [ { name: 'Beijing', continent: 'Asia' }, { name: 'Tokyo', continent: 'Asia' } ] }, { continent: 'North America', items: [ { name: 'New York', continent: 'North America' } ] }, { continent: 'Oceania', items: [ { name: 'Sydney', continent: 'Oceania' } ] } ]
额外提示
- 这种方法只需要遍历数组一次,时间复杂度是O(n),效率很高;
- 如果数组中存在
continent字段为undefined、null或者缺失的对象,可以加个默认值处理:
这样所有无有效continent的对象会被归到const continent = currentItem.continent || 'Unknown';Unknown组里。
内容的提问来源于stack exchange,提问作者pifou
相关产品推荐
相关产品推荐

