如何基于循环中的position变量构建结构化Accounts数组对象?
问题描述
我在创建包含若干字段的对象、将其推入数组并生成结构清晰的对象数组时遇到了困难。现有代码如下:
// function to extract integer from key field... function pad3(position) { return parseInt((position < 10 ? position.charAt(1) : position)) } for (let field of formData) { key = field[0] val = field[1] position = pad3(key.substring(0,2)) // 00- becomes 0, 01- becomes 1 etc... let obj = [] obj = {[key.substring(3,key.length)]: val} arr.push(obj) }
循环内打印key和val的结果如下:
console.log(key) // 00-account_a console.log(val) // 111 console.log(key) // 00-account_b console.log(val) // 222 console.log(key) // 01-account_a console.log(val) // 333 console.log(key) // 01-account_b console.log(val) // 444 console.log(key) // 02-account_a console.log(val) // 555 console.log(key) // 02-account_b console.log(val) // 666
以此类推……
我希望基于position变量生成结构清晰的数组对象,格式如下:
Accounts [ [0] { // <-- [0] based on "position" variable ... account_a: 111, account_b:222 }, [1] { account_a: 333, account_b:444 }, [2] { account_a: 555, account_b:666 }, ]
解决方案
你当前的代码每次循环都会创建一个新对象并直接推入数组,导致数组里是多个独立的单键对象,而不是按position分组的多键对象。修改思路是根据position值复用同一个对象,具体代码如下:
function pad3(position) { return parseInt((position < 10 ? position.charAt(1) : position)) } // 初始化空数组用于存储最终结果 const Accounts = []; for (let field of formData) { const key = field[0]; const val = field[1]; const position = pad3(key.substring(0,2)); const fieldName = key.substring(3); // 提取account_a、account_b这类字段名 // 如果当前position对应的对象还不存在,先创建一个空对象 if (!Accounts[position]) { Accounts[position] = {}; } // 将键值对添加到对应position的对象中 Accounts[position][fieldName] = val; }
关键修改点:
- 初始化
Accounts数组,不再每次循环创建新对象push - 循环时先检查
Accounts[position]是否存在,不存在则初始化空对象 - 直接将当前键值对赋值给对应position的对象,实现同一分组下的字段合并
这样处理后,Accounts数组就会按照position生成你需要的结构,每个索引位置对应一个包含该组所有字段的对象。
内容的提问来源于stack exchange,提问作者Cult of Tranquility
相关产品推荐
相关产品推荐

