You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
// 输出和上面一致

关键逻辑说明

  1. 拆分键值对:用split('=')把每个字符串拆成键名部分和属性值。
  2. 正则提取信息:用/items\[(\d+)\]\.(\w+)/匹配键名,捕获两个分组:
    • 第一个分组(\d+)提取数组的索引(比如0、1)
    • 第二个分组(\w+)提取对象的属性名(比如book、color)
  3. 构建对象结构:检查对应索引的对象是否存在,不存在则初始化,然后给属性赋值。

如果你的属性名包含特殊字符(比如连字符),可以把正则里的\w+改成[^.]+,这样就能匹配除了.之外的任意字符啦~

内容的提问来源于stack exchange,提问作者olo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:10:33