如何基于指定属性合并对象数组中的对象属性
修正基于name合并对象数组的JavaScript代码
原代码的问题在于,遍历对象属性时直接覆盖累加器中的对应属性,导致后面对象的空值会覆盖前面的有效值,最终无法保留所有非空的属性信息。
修正方案
在合并属性时,只保留非空的属性值:当累加器中当前属性为空,或者当前对象的属性值不为空时,更新累加器中的对应属性,确保所有有效值都被保留。
修正后的完整代码
const obj = [{ "name": "A. Nasila", "adm": "", "class": "4p", "mat": "80", "eng": "", "kis": "" }, { "name": "A. Nasila", "adm": "4886", "class": "", "mat": "", "eng": "", "kis": "39" }, { "name": "Mtu Bure", "adm": "", "class": "3L", "mat": "", "eng": "86", "kis": "" }, { "name": "A. Nasila", "adm": "", "class": "", "mat": "", "eng": "75", "kis": "" }, { "name": "Mtu Bure", "adm": "9790", "class": "", "mat": "77", "eng": "", "kis": "76" } ]; const groupedData = obj.reduce((acc, cur) => { const name = cur.name; // 初始化当前name对应的对象,若不存在则克隆当前对象 if (!acc[name]) { acc[name] = {...cur}; } else { // 遍历属性,仅保留非空值 for (const key in cur) { if (cur[key] !== "") { acc[name][key] = cur[key]; } } } return acc; }, {}); const result = Object.values(groupedData); // 格式化JSON输出,增加可读性 const jsonObject = JSON.stringify(result, null, 2); const div = document.getElementById("students"); const span = document.createElement("span"); span.innerHTML = jsonObject; div.appendChild(span);
对应的HTML代码无需修改:
<div id="students"> </div>
运行后即可得到你期望的合并结果,所有同name的对象会合并为一个,保留每个属性的非空有效值。
内容的提问来源于stack exchange,提问作者Abednego Nasila
相关产品推荐
相关产品推荐

