如何用ES6合并多数组并按symbol键聚合生成价格对比表格?
如何用ES6合并数组并按symbol聚合生成价格对比表格?
首先,我得先理清你的需求:你有多个包含symbol和price的数组,想要把它们合并,按symbol聚合后生成一个价格对比表格,每个symbol对应各个数组里的价格。
先看看你提供的输入数组:
Array 1
[ { "symbol": "CAT", "price": "10" }, { "symbol": "DOG ", "price": "15" } ]
Array 2
[ { "symbol": "CAT", "price": "20" }, { "symbol": "DOG ", "price": "25" } ]
Array 3
[ { "symbol": "CAT", "price": "15" }, { "symbol": "DOG ", "price": "13" } ]
你之前尝试的代码有几个问题:Object.entries()只能接受单个对象作为参数,不能直接传多个数组;而且map的逻辑也没处理多数组的聚合,还没正确返回结果。
下面是用ES6实现的完整方案,步骤清晰,还处理了symbol前后空格的问题(比如你数组里的DOG 带空格,避免和DOG不匹配):
实现代码
// 定义你的输入数组 const array1 = [ { "symbol": "CAT", "price": "10" }, { "symbol": "DOG ", "price": "15" } ]; const array2 = [ { "symbol": "CAT", "price": "20" }, { "symbol": "DOG ", "price": "25" } ]; const array3 = [ { "symbol": "CAT", "price": "15" }, { "symbol": "DOG ", "price": "13" } ]; // 把每个数组和对应的价格列名配对,方便后续处理 const priceGroups = [ { data: array1, column: 'Price1' }, { data: array2, column: 'Price2' }, { data: array3, column: 'Price3' } ]; // 用reduce构建聚合对象,key是去空格后的symbol,value是包含所有价格的对象 const aggregatedData = priceGroups.reduce((acc, { data, column }) => { data.forEach(item => { const cleanSymbol = item.symbol.trim(); // 如果这个symbol还没被初始化,先创建基础对象 if (!acc[cleanSymbol]) { acc[cleanSymbol] = { Name: cleanSymbol }; } // 给当前symbol添加对应列的价格 acc[cleanSymbol][column] = item.price; }); return acc; }, {}); // 把聚合对象转换成数组,方便生成表格行 const resultRows = Object.values(aggregatedData); // 生成最终的表格字符串 const tableHeader = 'Name|Price1|Price2|Price3|\n'; const tableBody = resultRows.map(row => `${row.Name} | ${row.Price1} | ${row.Price2} | ${row.Price3} |`).join('\n'); const finalTable = tableHeader + tableBody; console.log(finalTable);
运行结果
运行上面的代码后,你会得到想要的表格:
Name|Price1|Price2|Price3| CAT | 10 | 20 | 15 | DOG | 15 | 25 | 13 |
关键说明
- 去空格处理:用
trim()清理symbol的前后空格,避免因为空格导致同个标识被当成不同项(比如你的DOG和没空格的DOG)。 - reduce聚合:通过
reduce逐步构建聚合对象,遍历每个价格数组时,把对应价格添加到对应的symbol条目下。 - 灵活扩展:如果以后新增更多价格数组,只需要在
priceGroups里添加新的配对项即可,不用修改核心逻辑。
内容的提问来源于stack exchange,提问作者pazta
相关产品推荐
相关产品推荐

