如何高效重组含相同products键的JavaScript对象数组?
最简单高效的数组重组方案
嘿,这个需求其实很好实现,给你几个简洁又高效的方法,你可以根据场景选:
方法一:用flatMap快速合并(最简洁)
这个方法一步到位,先把所有对象里的products数组提取出来并合并,再包装成目标结构:
// 假设你的原数组叫originalArray const mergedProducts = originalArray.flatMap(item => item.products); const targetArray = [{ products: mergedProducts }];
flatMap会遍历原数组的每个元素,把每个元素的products数组“展开”后收集到一个新数组里,最后我们只需要把这个合并后的数组放到一个新对象里,再套进数组就搞定了。
方法二:用reduce累加合并(更灵活)
如果之后需要扩展逻辑(比如过滤某些products),用reduce会更灵活:
const targetArray = [ originalArray.reduce((result, currentItem) => { // 把当前item的products合并到结果的products里 result.products.push(...currentItem.products); return result; }, { products: [] }) // 初始值是一个空products的对象 ];
reduce从一个空的products对象开始,逐个把每个元素的products追加进去,最后返回的就是合并后的单个对象,再放进数组就是你要的结构。
如果你想直接修改原数组(不创建新数组)
要是不想生成新数组,想直接改原数组的话,可以这么做:
// 把后面所有元素的products合并到第一个元素里 originalArray[0].products.push( ...originalArray.slice(1).flatMap(item => item.products) ); // 移除第一个元素之后的所有元素 originalArray.splice(1);
这样原数组就直接变成你要的目标结构了。
至于你说的unshift()没成功,应该是因为unshift()是用来往数组开头添加元素的,而你需要的是合并数组元素内部的products数组,不是调整数组元素的位置,所以用它就不对啦。
内容的提问来源于stack exchange,提问作者IWI
相关产品推荐
相关产品推荐

