Node.js中如何合并同productID数据,将productImage转为数组
在Node.js中合并相同productID的对象并合并productImage数组
刚好之前处理过类似的需求,给你分享两种实用的实现方法,都能完美解决你要合并相同productID对象、把对应productImage合并成数组的需求:
方法一:使用Array.reduce()
这是最常用的方案,通过一次遍历就能完成合并,效率很高,适合处理大数据量:
var data = [ { "productID":18, "productTitle":"Watch", "productImage":"1588148225540.jpg" }, { "productID":18, "productTitle":"Watch", "productImage":"15881482433232.jpg" }, { "productID":19, "productTitle":"Shirt", "productImage":"1588148214343.jpg" } ]; const mergedData = Object.values(data.reduce((acc, item) => { // 用productID作为唯一标识的键 const key = item.productID; if (!acc[key]) { // 如果累加器里还没有这个ID的条目,创建新对象并将productImage转为数组 acc[key] = { ...item, productImage: [item.productImage] }; } else { // 如果已有该ID的条目,把当前的productImage推到数组中 acc[key].productImage.push(item.productImage); } return acc; }, {})); console.log(mergedData);
逻辑说明:
- 用
reduce遍历原数组,以productID作为临时对象的键,确保每个ID只存一条数据 - 首次遇到某个
productID时,复制该对象的所有字段,并把productImage包装成数组 - 后续遇到相同
productID时,直接把新的productImage追加到已有数组中 - 最后用
Object.values()把临时对象的value提取出来,得到你想要的数组格式
方法二:使用ES6 Map对象
如果你更喜欢更直观的键值对操作,用Map也是个不错的选择:
var data = [ { "productID":18, "productTitle":"Watch", "productImage":"1588148225540.jpg" }, { "productID":18, "productTitle":"Watch", "productImage":"15881482433232.jpg" }, { "productID":19, "productTitle":"Shirt", "productImage":"1588148214343.jpg" } ]; const productMap = new Map(); data.forEach(item => { const existingItem = productMap.get(item.productID); if (existingItem) { // 已有该ID的条目,追加图片 existingItem.productImage.push(item.productImage); } else { // 首次出现,存入Map并把图片转为数组 productMap.set(item.productID, { ...item, productImage: [item.productImage] }); } }); // 把Map的值转为数组 const mergedData = Array.from(productMap.values()); console.log(mergedData);
补充说明:
这两种方法都默认相同productID的其他字段(比如productTitle)完全一致,如果你的实际数据存在同ID但其他字段不同的情况,需要额外添加逻辑处理(比如保留第一个出现的值、做字段合并等),不过从你的示例数据来看,这个前提是成立的~
内容的提问来源于stack exchange,提问作者rahul5140
相关产品推荐
相关产品推荐

