TypeScript JSON操作:为父节点添加子节点属性求和值
给父级对象添加子数组月份属性求和值的解决方案
首先得说句实在的:用正则处理JSON真不是个靠谱的选择——JSON的结构灵活多变,空格、键顺序、嵌套内容都可能让正则失效。相比之下,直接解析成对象用代码计算才是稳当的做法。先给你推荐这个常规方案,再聊聊正则的思路(但真心不建议用)。
推荐方案:直接操作对象计算求和
下面是针对你的需求写的TypeScript代码,逻辑清晰还容易维护:
const oldArr = [{ "careerLevel": "Associate", "careerLevels": [ { "201609": 21, "201610": 22, "careerID": "10000120" }, { "201609": 31, "201610": 32, "careerID": "10000130" } ] }]; const newArr = oldArr.map(parentItem => { // 遍历子数组,累加每个月份的数值 const monthTotals = parentItem.careerLevels.reduce((acc, childItem) => { // 只处理6位数字的月份键 Object.keys(childItem).forEach(key => { if (/^\d{6}$/.test(key)) { acc[key] = (acc[key] || 0) + childItem[key as keyof typeof childItem]; } }); return acc; }, {} as Record<string, number>); // 把求和结果和原父对象合并,得到目标结构 return { ...monthTotals, ...parentItem }; }); console.log(newArr);
这段代码的核心逻辑:
- 用
map遍历原数组里的每个父对象 - 用
reduce遍历careerLevels子数组,逐个累加每个月份键对应的数值 - 用扩展运算符把求和结果和原父对象合并,保证最终结构符合你的要求
关于用正则实现的思路(仅作参考,不推荐)
如果你坚持想用正则处理,那只能先把JSON转成字符串,再做匹配、求和、替换操作。但这个方法非常脆弱,只能适配你当前的特定JSON结构,一旦结构有变化(比如键顺序调整、出现嵌套内容)就会出错。
给你写个针对当前结构的示例代码:
const oldJson = JSON.stringify(oldArr); // 提取所有月份键和对应数值 const monthMatches = oldJson.match(/"(\d{6})": (\d+)/g); const sumMap: Record<string, number> = {}; if (monthMatches) { monthMatches.forEach(match => { const [, monthKey, valueStr] = match.match(/"(\d{6})": (\d+)/)!; sumMap[monthKey] = (sumMap[monthKey] || 0) + parseInt(valueStr, 10); }); } // 把求和结果拼成JSON格式的字符串片段 const sumStr = Object.entries(sumMap) .map(([key, value]) => `"${key}": ${value}`) .join(', '); // 把求和片段插入到父对象的开头(匹配"careerLevel"的位置) const newJson = oldJson.replace(/{ "/, `{ ${sumStr}, "/`); const newArr = JSON.parse(newJson); console.log(newArr);
正则方案的局限性:
- 只能适配你当前的JSON键顺序,如果
careerLevel不在父对象的第一个位置,替换逻辑直接失效 - 如果JSON里有其他6位数字的键,或者字符串内容里包含类似
"201609"的文本,会导致求和错误 - 无法处理更深层次的嵌套结构
所以还是那句话,优先选择直接操作对象的方案,靠谱得多。
内容的提问来源于stack exchange,提问作者rp4361
相关产品推荐
相关产品推荐

