按指定前缀模式拆分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);
关键逻辑说明
- 分组标识提取:通过
split('.')拆分键名,用slice(0,2)取前两部分再拼接,得到S.1这类分组标识。 - 分组对象构建:用
reduce遍历所有键值对,为每个分组初始化空对象,直接将原始键值对存入对应分组。 - 转换为目标数组:最后用
Object.values()提取所有分组对象,得到你需要的数组格式。
运行这段代码即可得到符合预期的输出。
内容的提问来源于stack exchange,提问作者user13692246
相关产品推荐
相关产品推荐

