Node.js中用ES6将特定格式数组转为对象数组的实现方法
纯ES6实现数组转指定对象结构
嘿,这个需求用纯ES6完全能实现,不用借助第三方库~我给你两种常见的实现方式,你可以按需选择:
方式一:使用forEach遍历处理
这种方式逻辑直观,适合新手理解:
const arr = ['items[0].book=Book1', 'items[0].color=Red', 'items[0].bookCode=#1', 'items[1].book=Book2', 'items[1].color=Yellow', 'items[1].bookCode=#2', 'items[2].book=Book3', 'items[2].color=Blue', 'items[2].bookCode=#3']; // 初始化结果对象,包含空的items数组 const result = { items: [] }; arr.forEach(str => { // 拆分键名部分和属性值 const [keyPart, value] = str.split('='); // 用正则提取索引和属性名 const match = keyPart.match(/items\[(\d+)\]\.(\w+)/); if (match) { // 把索引字符串转成数字 const index = parseInt(match[1], 10); const propName = match[2]; // 如果当前索引的对象还不存在,先创建一个空对象 if (!result.items[index]) { result.items[index] = {}; } // 给对应对象的属性赋值 result.items[index][propName] = value; } }); console.log(result.items); // 输出:[{ book: "Book1", color: "Red", bookCode: "#1" }, { book: "Book2", color: "Yellow", bookCode: "#2" }, { book: "Book3", color: "Blue", bookCode: "#3" }]
方式二:使用reduce函数式处理
如果更喜欢函数式风格,可以用reduce来一步完成:
const arr = ['items[0].book=Book1', 'items[0].color=Red', 'items[0].bookCode=#1', 'items[1].book=Book2', 'items[1].color=Yellow', 'items[1].bookCode=#2', 'items[2].book=Book3', 'items[2].color=Blue', 'items[2].bookCode=#3']; const result = arr.reduce((acc, str) => { const [keyPart, value] = str.split('='); const match = keyPart.match(/items\[(\d+)\]\.(\w+)/); if (match) { const index = parseInt(match[1], 10); const propName = match[2]; // 简写:如果当前索引对象不存在就初始化空对象,否则用已有对象 acc.items[index] = acc.items[index] || {}; acc.items[index][propName] = value; } return acc; }, { items: [] }); // 初始值是包含空items数组的对象 console.log(result.items); // 输出和上面一致
关键逻辑说明
- 拆分键值对:用
split('=')把每个字符串拆成键名部分和属性值。 - 正则提取信息:用
/items\[(\d+)\]\.(\w+)/匹配键名,捕获两个分组:- 第一个分组
(\d+)提取数组的索引(比如0、1) - 第二个分组
(\w+)提取对象的属性名(比如book、color)
- 第一个分组
- 构建对象结构:检查对应索引的对象是否存在,不存在则初始化,然后给属性赋值。
如果你的属性名包含特殊字符(比如连字符),可以把正则里的\w+改成[^.]+,这样就能匹配除了.之外的任意字符啦~
内容的提问来源于stack exchange,提问作者olo
相关产品推荐
相关产品推荐

