【算法图解|3】JavaScript 如何实现数组去重

举报
孙叫兽 发表于 2021/03/28 00:07:13 2021/03/28
【摘要】 数组去重方法老生常谈,既然是常谈,我也来谈谈。 也许我们首先想到的是使用 indexOf 来循环判断一遍,但在这个方法之前,让我们先看看最原始的方法: var array = [1, 1, '1', '1']; function unique(array) { // res用来存储结果 var res = []; for (var i = 0, arrayLen...

数组去重方法老生常谈,既然是常谈,我也来谈谈。

也许我们首先想到的是使用 indexOf 来循环判断一遍,但在这个方法之前,让我们先看看最原始的方法:


  
  1. var array = [1, 1, '1', '1'];
  2. function unique(array) {
  3. // res用来存储结果
  4. var res = [];
  5. for (var i = 0, arrayLen = array.length; i < arrayLen; i++) {
  6. for (var j = 0, resLen = res.length; j < resLen; j++ ) {
  7. if (array[i] === res[j]) {
  8. break;
  9. }
  10. }
  11. // 如果array[i]是唯一的,那么执行完循环,j等于resLen
  12. if (j === resLen) {
  13. res.push(array[i])
  14. }
  15. }
  16. return res;
  17. }
  18. console.log(unique(array)); // [1, "1"]

 

在这个方法中,我们使用循环嵌套,最外层循环 array,里面循环 res,如果 array[i] 的值跟 res[j] 的值相等,就跳出循环,如果都不等于,说明元素是唯一的,这时候 j 的值就会等于 res 的长度,根据这个特点进行判断,将值添加进 res。

看起来很简单吧,之所以要讲一讲这个方法,是因为——————兼容性好!

我们可以用 indexOf 简化内层的循环:


  
  1. var array = [1, 1, '1'];
  2. function unique(array) {
  3. var res = [];
  4. for (var i = 0, len = array.length; i < len; i++) {
  5. var current = array[i];
  6. if (res.indexOf(current) === -1) {
  7. res.push(current)
  8. }
  9. }
  10. return res;
  11. }
  12. console.log(unique(array));

排序后去重,效率高

我们先将要去重的数组使用 sort 方法排序后,相同的值就会被排在一起,然后我们就可以只判断当前元素与上一个元素是否相同,相同就说明重复,不相同就添加进 res,


  
  1. var array = [1, 1, '1'];
  2. function unique(array) {
  3. var res = [];
  4. var sortedArray = array.concat().sort();
  5. var seen;
  6. for (var i = 0, len = sortedArray.length; i < len; i++) {
  7. // 如果是第一个元素或者相邻的元素不相同
  8. if (!i || seen !== sortedArray[i]) {
  9. res.push(sortedArray[i])
  10. }
  11. seen = sortedArray[i];
  12. }
  13. return res;
  14. }
  15. console.log(unique(array));

 

文章来源: sunmenglei.blog.csdn.net,作者:孙叫兽,版权归原作者所有,如需转载,请联系作者。

原文链接:sunmenglei.blog.csdn.net/article/details/111644076

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。