JavaScript按id归并对象时name字段嵌套如何转为一维数组或逗号分隔串
问题修复方案
问题原因
- 你的现有代码仅处理了
name字段为字符串的合并场景,当同id的第三条及以后数据进入合并逻辑时,name已经是数组类型,原有判断条件不生效,导致出现多层嵌套数组的问题。
最小改动方案(基于你的现有代码修改)
你只需要修改合并name的逻辑分支即可:
var newData = []; baseData.forEach(function(item, index) { if (newData.length === 0) { newData.push(item); } else { var dIndex = -1; newData.forEach(function(itm, idx) { if (item.id === itm.id) dIndex = idx; }); if (dIndex !== -1) { var oldname = newData[dIndex].name; // 👇 修改这里的逻辑 if (typeof oldname === 'string') { // 首次合并:字符串转数组 newData[dIndex].name = [oldname, item.name]; } else if (Array.isArray(oldname)) { // 非首次合并:直接追加值到数组末尾 oldname.push(item.name); } } else { newData.push(item); } } });
更高效的优化方案(时间复杂度O(n))
如果数据量较大,建议用对象作为id映射索引,避免每次遍历结果数组查找id:
const idMap = {}; baseData.forEach(item => { if (!idMap[item.id]) { // 首次遇到该id,初始化数据并把name转为数组 idMap[item.id] = {...item, name: [item.name]}; } else { // 已存在的id直接追加name值 idMap[item.id].name.push(item.name); } }); // 转换为最终数组格式 const newData = Object.values(idMap);
如果需要把name转为逗号分隔的字符串,在上述代码最后补充一行即可:
newData.forEach(item => item.name = item.name.join(','));
内容的提问来源于stack exchange,提问作者pee2pee
相关产品推荐
相关产品推荐

