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

按指定前缀模式拆分JavaScript对象的技术实现问题

问题描述

我正尝试根据以S.1.1.0这类模式开头的键来拆分对象。以下是我的JavaScript代码:

const obj = {
  "S.1.1.0": "Hi",
  "S.1.1.1": "what is your name",
  "S.1.1.2": "Can we meet",
  "S.2.1.1": "what is the time now",
  "S.2.1.2a": "It is 6 PM",
  "S.3.1.1b": "where do you live",
  "S.3.1.2": "how is the weather",
  "S.3.1.3": "it is very cold",
  "S.3.1.3b": "yes",
}

const result = Object.entries(obj).reduce((a, [key, val]) => { 
  const [s, k, v] = key.split('.')  
  const item = a.find(({
    key: itemkey
  }) => itemkey === k)  
 console.log(item)
  if (item) {  
    item[v] = val
  } else {  
    a.push({
      key: k,
      [v]: val
    })
  }

  return a
}, [])

console.log(result)

当前代码的输出不符合预期,我期望将所有以S.1开头的键值对合并到一个对象中,以S.2开头的合并到另一个对象中,以此类推,最终得到如下格式的数组:

[{
        "S.1.1.0": "Hi",
        "S.1.1.1": "what is your name",
        "S.1.1.2": "Can we meet"
      },
      {
        "S.2.1.1": "what is the time now",
        "S.2.1.2a": "It is 6 PM"
      },
      {
        "S.3.1.1b": "where do you live",
        "S.3.1.2": "how is the weather",
        "S.3.1.3": "it is very cold",
        "S.3.1.3b": "yes"
      }
    ]

请帮忙修正代码,实现符合预期的对象拆分效果。

修正后的代码及解释

你的代码问题在于拆分键的逻辑有误,且错误地给分组对象添加了额外的key属性,没有保留原始键名。正确的思路是提取每个键的前缀(如S.1)作为分组标识,将对应键值对直接合并到同一分组对象中。

修正后的代码如下:

const obj = {
  "S.1.1.0": "Hi",
  "S.1.1.1": "what is your name",
  "S.1.1.2": "Can we meet",
  "S.2.1.1": "what is the time now",
  "S.2.1.2a": "It is 6 PM",
  "S.3.1.1b": "where do you live",
  "S.3.1.2": "how is the weather",
  "S.3.1.3": "it is very cold",
  "S.3.1.3b": "yes",
}

const result = Object.values(Object.entries(obj).reduce((groups, [key, val]) => {
  // 提取分组标识:截取键的前两部分(如S.1)
  const groupKey = key.split('.').slice(0, 2).join('.');
  // 若分组不存在,初始化空对象
  if (!groups[groupKey]) {
    groups[groupKey] = {};
  }
  // 将原始键值对添加到对应分组
  groups[groupKey][key] = val;
  return groups;
}, {}));

console.log(result);

关键逻辑说明

  1. 分组标识提取:通过split('.')拆分键名,用slice(0,2)取前两部分再拼接,得到S.1这类分组标识。
  2. 分组对象构建:用reduce遍历所有键值对,为每个分组初始化空对象,直接将原始键值对存入对应分组。
  3. 转换为目标数组:最后用Object.values()提取所有分组对象,得到你需要的数组格式。

运行这段代码即可得到符合预期的输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:43:22