一给 发表于 2025-4-2 01:23:04

蓝桥杯 web 收集帛书碎片(数组去重.set方法)

超级牛逼的答案:一行搞定
return [...new Set(puzzles.flat())]

[*][...new Set(puzzles.flat())] 的核心思想是:

[*]展平:将多维数组转为一维。puzzles.flat()
[*]去重:利用 Set 的唯一性特性自动过滤重复元素。new Set()
[*]转数组:通过展开运算符返回终极结果。   ...

[*]这种写法轻便高效,是当代 JavaScript 中处置惩罚数组去重的常见模式。
 
[*]也可以写成 return Array.from(new Set(puzzles.flat()))    如何想到标题是要处置惩罚数组去重的呢?
        固然是审题!
https://i-blog.csdnimg.cn/direct/4be32f2647c74b3e93844e09f1af64ef.png
暗含着咱们只要去重,不消管数量
在 JavaScript 中,数组去重是常见的操纵,以下是几种常见且高效的实现方法及原理分析:
1. 利用 Set 数据布局(ES6)

原理:Set 是 ES6 引入的内置对象,其成员唯一,自动去重。
写法:
const array = ;
const uniqueArray = [...new Set(array)]; // 或 Array.from(new Set(array));
console.log(uniqueArray); // 长处:


[*]轻便高效:时间复杂度为 O(n),适合大数据量。
[*]保持插入顺序:ES2019 后 Set 保留元素插入顺序。 缺点:
[*]不支持旧浏览器:需 polyfill 或兼容处置惩罚。
2. 利用 filter + indexOf/includes

原理:遍历数组,保留首次出现的元素,后续重复元素被过滤。
写法:
const array = ;
const uniqueArray = array.filter((item, index) => {
return array.indexOf(item) === index; // 或 array.indexOf(item, index + 1) === -1
});
// 或使用 includes:
const uniqueArray2 = array.filter((item, index, self) => {
return self.indexOf(item) === index;
});
console.log(uniqueArray); // 长处:


[*]兼容性好:支持 ES5 及以上。
[*]简朴易懂。
[*] 缺点:时间复杂度高:O(n²)(indexOf 内部遍历),大数据量时服从低。
3. 利用 reduce 方法

原理:通过累加器(accumulator)收集唯一元素。
本题写法:
function collectPuzzle(...puzzles) {
    let arr =puzzles.flat()
    return arr.reduce((acc,cur)=>{
    if(!acc.includes(cur)){
    acc.push(cur)
    }
    return acc
    },[])
} 长处:


[*]可读性强:逻辑清晰,适合复杂场景。
[*] 缺点:时间复杂度:O(n²)(includes 内部遍历)。
疑问:
1.let可以改为const吗?
在JavaScript中,let 和 const 都用于声明变量,但它们之间有一些关键的区别:


[*]let 声明的变量可以被重新赋值。
[*]const 声明的变量一旦被初始化后就不能被重新赋值。
对于这段代码,我们可以看到 arr 是一个数组,而且它在后续的代码中会被修改(通过 reduce 方法)。因此,利用 let 是合适的,由于数组 arr 会被修改。
2.第一个return为什么不能删?
return arr.reduce(...) 它的作用是将 reduce 的结果(一个去重后的数组)返回给调用者。
3.第二个return为什么不能删?
reduce 的回调函数必须返回累积器的值(acc),以便在下一次迭代中继续利用。
4. 对象数组去重

场景:当数组元素是对象时,需根据对象属性去重。
(利用 Map):
const uniqueArray = [...new Map(array.map(item => )).values()]; 注意事项:


[*]需指定唯一属性(如 id),否则默认比较对象引用。
总结与选择建议

方法时间复杂度实用场景兼容性SetO(n)根本范例,当代浏览器需 ES6 支持filter + indexOfO(n²)小数据量,兼容性要求高全部浏览器reduceO(n²)需要可读性,逻辑扩展性强全部浏览器双重循环O(n²)简朴场景,需原地修改全部浏览器对象数组(Map/属性)O(n)对象去重,需指定唯一属性需 ES6 支持 注意事项


[*]元素范例:

[*]根本范例:直接比较值(如 number, string)。
[*]对象/数组:需用 JSON.stringify 或自定义比较函数。

[*]性能:

[*]大数据量优先选 Set 或哈希表方法。
[*]对象数组需根据唯一属性去重。

[*]顺序保留:

[*]所有方法均保留首次出现的元素顺序。

根据实际需求选择合适的方法,比方:


[*]当代项目推荐 Set;
[*]兼容旧浏览器用 filter + indexOf;
[*]对象数组用 Map 或自定义哈希。    相干类似的标题
[*] 蓝桥杯 web 探求小狼人(reduce方法)
[*] 蓝桥杯 web 分享点滴(reduce方法)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 蓝桥杯 web 收集帛书碎片(数组去重.set方法)