You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将两个数组映射为对象:重复键对应值存为数组

解决数组映射为对象的重复键值合并问题

你的代码逻辑错误在于每次都直接将值包装成数组,且未处理键已存在的情况,导致旧值被覆盖,所有值都被强制转为数组。以下是修正后的实现方案:

修正后的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}

核心逻辑说明

  1. 遍历过程中先取出当前的键和对应值
  2. 用hasOwnProperty检查对象中是否已存在该键,避免继承属性干扰
  3. 键已存在时:
    • 若当前值是数组,直接追加新值
    • 若不是数组,将原有值与新值组合成数组赋值
  4. 键不存在时,直接将值赋值给该键

内容的提问来源于stack exchange,提问作者Emm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:37:24