使用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
相关产品推荐
相关产品推荐

