如何将两个数组映射为对象:重复键对应值存为数组
解决数组映射为对象的重复键值合并问题
你的代码逻辑错误在于每次都直接将值包装成数组,且未处理键已存在的情况,导致旧值被覆盖,所有值都被强制转为数组。以下是修正后的实现方案:
修正后的for循环版本
const first = [3,0,5,3]; const second = [1,3,10,5]; const newObj = {}; for(let i = 0; i < first.length; i++){ const key = first[i]; const value = second[i]; if (newObj.hasOwnProperty(key)) { // 键已存在时,判断当前值是否为数组 if (Array.isArray(newObj[key])) { newObj[key].push(value); } else { // 非数组则转为包含原有值和新值的数组 newObj[key] = [newObj[key], value]; } } else { // 键不存在时直接赋值 newObj[key] = value; } } console.log(newObj); // 输出 {0: 3, 3: [1,5], 5: 10}
更简洁的reduce版本
const first = [3,0,5,3]; const second = [1,3,10,5]; const newObj = first.reduce((acc, key, index) => { const value = second[index]; if (acc[key]) { acc[key] = Array.isArray(acc[key]) ? [...acc[key], value] : [acc[key], value]; } else { acc[key] = value; } return acc; }, {}); console.log(newObj); // 输出 {0: 3, 3: [1,5], 5: 10}
核心逻辑说明
- 遍历过程中先取出当前的键和对应值
- 用
hasOwnProperty检查对象中是否已存在该键,避免继承属性干扰 - 键已存在时:
- 若当前值是数组,直接追加新值
- 若不是数组,将原有值与新值组合成数组赋值
- 键不存在时,直接将值赋值给该键
内容的提问来源于stack exchange,提问作者Emm
相关产品推荐
相关产品推荐

