JS仅当user键值匹配时合并两个对象数组的问题排查
原有代码问题排查
- 存储结构用错:初始化
result为数组,却用字符串类型的user值作为键赋值。这类自定义字符串键不会成为数组的数字索引元素,数组实际长度始终为0,后续调用filter遍历索引项时拿不到任何值,自然返回空数组。 - 匹配逻辑不符合需求:就算修正存储结构,原有逻辑会把两个数组里所有出现过的user项都保留,比如示例中arr2独有的
john也会被输出,和「仅合并两个数组user完全匹配的项、最终结果对齐arr1原有项」的要求不符。
正确实现方案
先将arr2转换为以user为键的查找映射,避免嵌套循环提升性能,再遍历arr1匹配对应项合并即可,最终输出完全符合预期:
const arr1 = [{ bank: 1, user: 'fred', depositAmount: 100, withdrawalAmount: 0 }]; const arr2 = [{ user: 'fred', gender: 'male', age: 27, state: "arizona" }, { user: 'john',gender: 'male', age: 28, state: "texas" }]; // 构建arr2的user查找表 const userMap = new Map(arr2.map(item => [item.user, item])); // 遍历arr1合并匹配项 const result = arr1.filter(item => userMap.has(item.user)) .map(item => ({...item, ...userMap.get(item.user)})); console.log(result);
如果需要直接修改原arr1而不是生成新数组,可以用以下写法:
const userMap = new Map(arr2.map(item => [item.user, item])); arr1.forEach((item, idx) => { if (userMap.has(item.user)) { Object.assign(arr1[idx], userMap.get(item.user)); } });
运行后输出和预期完全一致:
[{ bank: 1, user: 'fred', depositAmount: 100, withdrawalAmount: 0, gender: 'male', age: 27, state: "arizona" }]
内容的提问来源于stack exchange,提问作者BreadBoard.ini
相关产品推荐
相关产品推荐

