如何合并含嵌套Values的数组?实现对应项求和与属性拼接
嵌套结构数组的高效合并方案
需求说明
- 两个数组对应索引项的嵌套
Values数组中,每个对象的Input1、Input2值分别对应求和 Name字段进行字符串拼接(第一个数组项的Name在前,第二个在后)key字段转为字符串后拼接,最终保留为数字类型
示例输入
const InputValues1 = [ { "Values": [ {"Input1": 1, "Input2": -1}, {"Input1": 1, "Input2": -2}, {"Input1": 2, "Input2": -2}, {"Input1": 4, "Input2": -4} ], "Name": "AA", "key": 1 }, { "Values": [ {"Input1": 1, "Input2": -2}, {"Input1": 3, "Input2": 5}, {"Input1": 3, "Input2": 2}, {"Input1": 1, "Input2": -2} ], "Name": "AB", "key": 2 } ]; const InputValues2 = [ { "Values": [ {"Input1": 3, "Input2": 2}, {"Input1": 2, "Input2": 1}, {"Input1": 1, "Input2": 1}, {"Input1": 1, "Input2": 6} ], "Name": "BA", "key": 1 }, { "Values": [ {"Input1": 30, "Input2": 1}, {"Input1": 6, "Input2": 2}, {"Input1": 1, "Input2": 2}, {"Input1": 1, "Input2": 8} ], "Name": "BB", "key": 2 } ];
期望输出
const CombinedOutput = [ { "Values": [ {"Input1": 4, "Input2": 1}, {"Input1": 3, "Input2": -1}, {"Input1": 3, "Input2": -1}, {"Input1": 5, "Input2": 2} ], "Name": "AABA", "key": 11 }, { "Values": [ {"Input1": 31, "Input2": -1}, {"Input1": 9, "Input2": 7}, {"Input1": 4, "Input2": 4}, {"Input1": 2, "Input2": 6} ], "Name": "ABBB", "key": 22 } ];
高效实现方案
可以通过嵌套map函数实现,这种写法简洁且保持函数式风格,同时避免冗余循环代码,处理大规模数据时性能也能得到保障:
const combineArrays = (arr1, arr2) => { // 假设两个数组长度一致,需处理长度不一致的情况可额外添加判断 return arr1.map((item1, index) => { const item2 = arr2[index]; return { Values: item1.Values.map((val1, valIndex) => { const val2 = item2.Values[valIndex]; return { Input1: val1.Input1 + val2.Input1, Input2: val1.Input2 + val2.Input2 }; }), Name: item1.Name + item2.Name, key: Number(String(item1.key) + String(item2.key)) }; }); }; // 调用示例 const CombinedOutput = combineArrays(InputValues1, InputValues2); console.log(CombinedOutput);
代码说明
- 外层
map遍历第一个数组的每一项,同时通过索引获取第二个数组对应位置的项 - 内层
map处理嵌套的Values数组,对每个对象的Input1和Input2分别求和 Name字段直接拼接两个数组对应项的Name值key先转为字符串拼接,再转回数字类型,符合示例要求
扩展说明
如果需要处理两个数组长度不一致的情况,可以在函数开头添加判断逻辑,比如只处理到较短数组的长度:
const combineArrays = (arr1, arr2) => { const minLength = Math.min(arr1.length, arr2.length); return arr1.slice(0, minLength).map((item1, index) => { const item2 = arr2[index]; return { Values: item1.Values.map((val1, valIndex) => { const val2 = item2.Values[valIndex]; return { Input1: val1.Input1 + val2.Input1, Input2: val1.Input2 + val2.Input2 }; }), Name: item1.Name + item2.Name, key: Number(String(item1.key) + String(item2.key)) }; }); };
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

