如何根据两个对象数组的匹配规则生成指定格式的新数组?
问题分析
你原有代码无法得到正确结果,存在以下几个语法和逻辑错误:
- 初始化语法错误:
var targetArray = ["category": "None"]属于非法语法,数组不能直接存储键值对,目标结构是数组包裹一个对象,应该先初始化内部的结果对象 - 缺少映射关系:没有建立
toBeKeysArray中id和处理后键名的对应关系,无法通过col_id直接匹配到要赋值的属性名 - 累加逻辑错误:
push是向数组新增元素的方法,无法实现对象属性值的累加,且没有将字符串格式的data转为数字,也没有给聚合属性设置初始值0,直接运算会得到NaN - 硬编码键名错误:
"toBeKeysArray.seriesTempHeader"是固定字符串,无法动态获取每个项对应的实际键名
正确实现代码
// 初始化结果对象,先写入固定的category属性 const aggregateResult = { category: "None" }; // 构建id与处理后键名的映射表,同时初始化每个统计键的初始值为0 const idKeyMap = {}; toBeKeysArray.forEach(configItem => { // 按规则处理键名:移除所有空格后转为小写 const statKey = configItem.seriesTempHeader.replace(/\s/g, '').toLowerCase(); idKeyMap[configItem.id] = statKey; aggregateResult[statKey] = 0; }); // 遍历第一个数组做值累加 firstArray.forEach(dataItem => { const matchKey = idKeyMap[dataItem.col_id]; // 仅处理col_id在统计范围内的项 if (matchKey) { const dataValue = Number(dataItem.data); // 跳过无法转为有效数字的data,避免出现NaN结果 if (!isNaN(dataValue)) { aggregateResult[matchKey] += dataValue; } } }); // 按要求包装为数组格式 const targetArray = [aggregateResult];
效果验证
针对你给出的示例数据:
- 映射表会生成
{17: "deerlast", 16: "blueitem"},初始结果对象为{category: "None", deerlast: 0, blueitem: 0} - 遍历
firstArray时,col_id=17的两个项data值10、32累加后deerlast为42;col_id=16的有效数字项累加后blueitem为80 - 最终输出完全符合要求:
[{ "deerlast": 42, "blueitem": 80, "category": "None"}]
内容的提问来源于stack exchange,提问作者Beginner_Hello
相关产品推荐
相关产品推荐

