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

使用Reduce/Map将嵌套数组转换为唯一值数组

使用reduce/map实现嵌套数组去重并转为一维数组

很高兴你已经用嵌套循环实现了需求!下面我来分享几种用reduce(结合可选的map)实现的方案,代码更简洁且符合函数式编程的风格:

方案1:reduce扁平化 + Set去重(最简洁)

这个方案先用reduce把所有子数组合并成一维数组,再利用Set自动去重的特性快速得到唯一值数组:

function uniteUnique(...arrays) {
  // 用reduce将所有子数组拼接成一维数组
  const flattenedArray = arrays.reduce((accumulator, currentSubArray) => {
    return accumulator.concat(currentSubArray);
  }, []);
  
  // 通过Set去重,再转回数组
  return [...new Set(flattenedArray)];
}

// 测试你的示例
console.log(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1])); // 输出 [1, 3, 2, 5, 4]

这里用ES6的剩余参数...arrays替代了Array.from(arguments),写法更直观。reduce的累加器accumulator初始为空数组,每次把当前子数组拼接到累加器里,完成扁平化。最后用展开运算符...把Set转换回普通数组。

方案2:用reduce同时完成扁平化和去重

如果不想依赖Set,可以在reduce的过程中直接判断元素是否重复,一步到位:

function uniteUnique(...arrays) {
  return arrays.reduce((accumulator, currentSubArray) => {
    // 遍历当前子数组的每个元素
    currentSubArray.forEach(item => {
      // 检查累加器中是否已存在该元素,不存在则添加
      if (!accumulator.includes(item)) {
        accumulator.push(item);
      }
    });
    return accumulator;
  }, []); // 初始累加器为空数组
}

这个逻辑和你原来的嵌套循环很像,只是用reduce和forEach替代了手动的for循环,代码更简洁易读。

关于map的使用

map的核心作用是转换数组的每个元素,它本身不会帮我们扁平化数组。如果一定要用到map,可以先通过map遍历子数组(虽然这里map只是返回原数组,作用不大),再结合concat扁平化:

function uniteUnique(...arrays) {
  // 用map遍历所有子数组(这里只是为了满足使用map的需求)
  const mappedSubArrays = arrays.map(subArr => subArr);
  
  // 扁平化数组
  const flattenedArray = [].concat(...mappedSubArrays);
  
  // 去重
  return [...new Set(flattenedArray)];
}

不过实际开发中,reduce在处理数组累加/合并的场景下比map更合适,所以优先推荐前两种方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:25:53