本文介绍如何将数组中每个对象的键名提取为新字段(如 id),原键对应的值映射为新字段(如 value),最终生成按对象分组的嵌套数组,避免 push() 多参数误用导致的结构错误。
本文介绍如何将数组中每个对象的键名提取为新字段(如 `id`),原键对应的值映射为新字段(如 `value`),最终生成按对象分组的嵌套数组,避免 `push()` 多参数误用导致的结构错误。
在前端数据处理中,常需将“宽表”格式(即对象含多个同级属性)转换为“长表”结构(每个属性拆为独立条目)。例如,将 { you: 100, me: 75 } 转换为 [ { id: 'you', value: 100 }, { id: 'me', value: 75 } ] —— 这一操作本质是键值对的结构重组。
但需特别注意:原始代码中 field_arr.push(...) 使用了展开式多参数传入,导致所有子对象被压入同一层级,最终输出为一维扁平数组;而目标输出是每个原始对象对应一个独立的子数组,即二维结构 [[...], [...], [...]]。关键修复在于:将每组转换结果作为一个数组整体传入 push(),而非多个独立对象。
以下是修正后的完整实现:
const list = [ { you: 100, me: 75, foo: 116, bar: 15 }, { you: 234, me: 33, foo: 356, bar: 1 }, { you: 567, me: 77, foo: 99, bar: 20 }];const func1 = () => { const field_arr = []; for (const obj of list) { // ✅ 正确:将四个新对象封装为一个数组,再整体 push field_arr.push([ { id: "you", value: obj.you }, { id: "me", value: obj.me }, { id: "foo", value: obj.foo }, { id: "bar", value: obj.bar } ]); } func2(field_arr);};const func2 = async (vars) => { console.log(vars); // 输出符合预期的三维结构: // [ // [{id:'you',value:100}, {id:'me',value:75}, ...], // [{id:'you',value:234}, ...], // ... // ]};func1();
⚠️ 注意事项:
field_arr.push( Object.entries(obj).map(([key, value]) => ({ id: key, value })));
总结:结构化数据转换的核心在于明确目标嵌套层级,并谨慎使用数组方法——一次 push([...]) 得到子数组,多次 push(...) 得到扁平项。理解 JS 原生方法的行为边界,是写出可维护数据处理逻辑的第一步。