登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
轻量养虾,开箱即用!低 Token + 稳定算力,Gitee & 模力方舟联合出品的 PocketClaw 正式开售!点击了解详情
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
3
Star
47
Fork
22
DreamCoders
/
CoderGuide
代码
Issues
1169
Pull Requests
0
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
开发画像分析
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
数组去重方法总结(10种)
待办的
#IAG9MU
陌生人
拥有者
创建于
2024-07-29 16:06
<h5 style="text-align: start;">一、用<a href="https://so.csdn.net/so/search?q=ES6&spm=1001.2101.3001.7020" target="_blank">ES6</a>的Set方法</h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; //Set数据结构,它类似于数组,其成员的值都是唯一的 let unique = Array.from(new Set(arr)); //let unique = [...new Set(arr)]; //也可以使用展开运算符 console.log(unique); //[1, true, "true", "false", null, undefined, NaN, "NaN", {…}, {…}]</code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">原理:Set方法会对对象的hash结果和值进行比较,如果都相等则去重,否则保留。这种方法代码量少,缺点:兼容性不是最好的,无法去除空对象。</span></p><h5 style="text-align: start;">二、for循环 + indexOf / lastIndexOf / includes / find</h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; let unique = []; for (let i = 0; i < arr.length; i++) { //indexOf等于-1说明不存在 if(unique.indexOf(arr[i]) == -1){ unique.push(arr[i]); } } console.log(unique); // [1, true, "true", "false", null, undefined, NaN, NaN, "NaN", {…}, {…}]</code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">缺点:无法去重空对象和NaN</span></p><h5 style="text-align: start;">三、forEach + indexOf</h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; let unique = []; arr.forEach(item=>{ if(unique.indexOf(item) == -1){ unique.push(item); } }) console.log(unique); // [1, true, "true", "false", null, undefined, NaN, NaN, "NaN", {…}, {…}]</code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">缺点:这种方法和for循环差不多,无法去重空对象和NaN</span></p><h5><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">四、filter + indexOf</span></h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; let unique = arr.filter((item,index) =>{ //当前元素在原始数组的第一个索引是否等于当前索引,等于说明该元素第一次出现则留下,不等则说明前面已经出现过则是重复的。 arr.indexOf(item) == item; }) console.log(unique); // [1, true, "true", "false", null, undefined, "NaN", {…}, {…}] </code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">缺点:无法去重空对象</span></p><h5><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">五、排序数组去重</span></h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; arr = arr.sort(); let unique = []; //先对数组排序,然后相邻的元素对比,不同的放到新数组里面。 for(let i = 0;i<arr.length;i++){ if(arr[i] != arr[i+1]){ unique.push(arr[i]); } } console.log(unique) //[1, NaN, NaN, "NaN", {…}, {…}, "false", null, true, "true"] </code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">缺点:无法去重空对象和NaN</span></p><h5><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">六、对象属性唯一性特征</span></h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; let obj={}; let unique=[]; //将数组值作为对象的属性名,当不存在时,则放入对象中 (利用对象的属性不可重复) for (let i = 0; i < arr.length; i++) { if (!obj[arr[i]]) { obj[arr[i]] = 1; unique.push(arr[i]); } } console.log(unique); // [1, true, "false", null, undefined, NaN, {…}] </code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">缺点:可以去重NaN和空对象,但是直接把“true”、“NaN”也去掉了</span></p><p><br></p><h5><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">七、利用hasOwnProperty</span></h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; let obj = {}; //将数组值作为对象的属性名,当不存在时,则放入对象中 (利用对象的属性不可重复) //typeof item + item作为属性名 let unique = arr.filter((item,index)=>{ return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true) }) console.log(unique); //[1, true, "true", "false", null, undefined, NaN, "NaN", {…}] </code></pre><p><span style="color: rgb(225, 60, 57); background-color: rgb(255, 255, 255); font-size: 16px;"><strong>完美去重</strong></span></p><p><br></p><h5><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">八、reduce + inculdes</span></h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; let unique = arr.reduce((prev,cur) => prev.includes(cur)?prev:[...prev,cur],[]) console.log(unique); //[1, true, "true", "false", null, undefined, NaN, "NaN", {…}, {…}] </code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">缺点:无法去重空对象</span></p><p><br></p><h5><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">九、利用map数据结构去重</span></h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; let map = new Map(); let unique = []; //因为map里面不会出现相同的key值,所以最后得到的map的key值是去重后的结果。 //判断map里面是否有某个键,没有就push到unique里面同时给map添加一个键 for(let i = 0;i<arr.length;i++){ if(!map.has(arr[i])){ map.set(arr[i],false);//false代表没有然后添加键 unique.push(arr[i]); } } console.log(unique); //[1, true, "true", "false", null, undefined, NaN, "NaN", {…}, {…}] </code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">缺点:无法去重空对象</span></p><p><br></p><h5><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">十、递归去重</span></h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; let unique = arr let len = unique .length; unique.sort(function(a,b){ //排序后更加方便去重 return a - b; }) function recursive(index){ if(index >= 1){ if(unique[index] === unique[index-1]){ unique.splice(index,1); } recursive(index - 1); //递归loop,然后数组去重 } } recursive(len-1); console.log(unique); //[1, true, "true", "false", null, NaN, NaN, "NaN", {…}, {…}, undefined] </code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">缺点:无法去重空对象和NaN</span></p>
<h5 style="text-align: start;">一、用<a href="https://so.csdn.net/so/search?q=ES6&spm=1001.2101.3001.7020" target="_blank">ES6</a>的Set方法</h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; //Set数据结构,它类似于数组,其成员的值都是唯一的 let unique = Array.from(new Set(arr)); //let unique = [...new Set(arr)]; //也可以使用展开运算符 console.log(unique); //[1, true, "true", "false", null, undefined, NaN, "NaN", {…}, {…}]</code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">原理:Set方法会对对象的hash结果和值进行比较,如果都相等则去重,否则保留。这种方法代码量少,缺点:兼容性不是最好的,无法去除空对象。</span></p><h5 style="text-align: start;">二、for循环 + indexOf / lastIndexOf / includes / find</h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; let unique = []; for (let i = 0; i < arr.length; i++) { //indexOf等于-1说明不存在 if(unique.indexOf(arr[i]) == -1){ unique.push(arr[i]); } } console.log(unique); // [1, true, "true", "false", null, undefined, NaN, NaN, "NaN", {…}, {…}]</code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">缺点:无法去重空对象和NaN</span></p><h5 style="text-align: start;">三、forEach + indexOf</h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; let unique = []; arr.forEach(item=>{ if(unique.indexOf(item) == -1){ unique.push(item); } }) console.log(unique); // [1, true, "true", "false", null, undefined, NaN, NaN, "NaN", {…}, {…}]</code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">缺点:这种方法和for循环差不多,无法去重空对象和NaN</span></p><h5><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">四、filter + indexOf</span></h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; let unique = arr.filter((item,index) =>{ //当前元素在原始数组的第一个索引是否等于当前索引,等于说明该元素第一次出现则留下,不等则说明前面已经出现过则是重复的。 arr.indexOf(item) == item; }) console.log(unique); // [1, true, "true", "false", null, undefined, "NaN", {…}, {…}] </code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">缺点:无法去重空对象</span></p><h5><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">五、排序数组去重</span></h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; arr = arr.sort(); let unique = []; //先对数组排序,然后相邻的元素对比,不同的放到新数组里面。 for(let i = 0;i<arr.length;i++){ if(arr[i] != arr[i+1]){ unique.push(arr[i]); } } console.log(unique) //[1, NaN, NaN, "NaN", {…}, {…}, "false", null, true, "true"] </code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">缺点:无法去重空对象和NaN</span></p><h5><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">六、对象属性唯一性特征</span></h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; let obj={}; let unique=[]; //将数组值作为对象的属性名,当不存在时,则放入对象中 (利用对象的属性不可重复) for (let i = 0; i < arr.length; i++) { if (!obj[arr[i]]) { obj[arr[i]] = 1; unique.push(arr[i]); } } console.log(unique); // [1, true, "false", null, undefined, NaN, {…}] </code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">缺点:可以去重NaN和空对象,但是直接把“true”、“NaN”也去掉了</span></p><p><br></p><h5><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">七、利用hasOwnProperty</span></h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; let obj = {}; //将数组值作为对象的属性名,当不存在时,则放入对象中 (利用对象的属性不可重复) //typeof item + item作为属性名 let unique = arr.filter((item,index)=>{ return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true) }) console.log(unique); //[1, true, "true", "false", null, undefined, NaN, "NaN", {…}] </code></pre><p><span style="color: rgb(225, 60, 57); background-color: rgb(255, 255, 255); font-size: 16px;"><strong>完美去重</strong></span></p><p><br></p><h5><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">八、reduce + inculdes</span></h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; let unique = arr.reduce((prev,cur) => prev.includes(cur)?prev:[...prev,cur],[]) console.log(unique); //[1, true, "true", "false", null, undefined, NaN, "NaN", {…}, {…}] </code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">缺点:无法去重空对象</span></p><p><br></p><h5><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">九、利用map数据结构去重</span></h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; let map = new Map(); let unique = []; //因为map里面不会出现相同的key值,所以最后得到的map的key值是去重后的结果。 //判断map里面是否有某个键,没有就push到unique里面同时给map添加一个键 for(let i = 0;i<arr.length;i++){ if(!map.has(arr[i])){ map.set(arr[i],false);//false代表没有然后添加键 unique.push(arr[i]); } } console.log(unique); //[1, true, "true", "false", null, undefined, NaN, "NaN", {…}, {…}] </code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">缺点:无法去重空对象</span></p><p><br></p><h5><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">十、递归去重</span></h5><pre><code class="language-javascript">let arr =[1,1,true,true,"true","false","false",null,null,undefined,undefined,NaN,NaN,"NaN",{},{}]; let unique = arr let len = unique .length; unique.sort(function(a,b){ //排序后更加方便去重 return a - b; }) function recursive(index){ if(index >= 1){ if(unique[index] === unique[index-1]){ unique.splice(index,1); } recursive(index - 1); //递归loop,然后数组去重 } } recursive(len-1); console.log(unique); //[1, true, "true", "false", null, NaN, NaN, "NaN", {…}, {…}, undefined] </code></pre><p><span style="color: rgb(77, 77, 77); background-color: rgb(255, 255, 255); font-size: 16px;">缺点:无法去重空对象和NaN</span></p>
评论 (
0
)
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
Html/JS/CSS
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
分支 (
-
)
标签 (
-
)
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(1)
1
https://gitee.com/DreamCoders/CoderGuide.git
git@gitee.com:DreamCoders/CoderGuide.git
DreamCoders
CoderGuide
CoderGuide
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册