素材巴巴 > 程序开发 >

js 数组去重复--通用方法

程序开发 2023-09-04 18:54:33

js去重,下面这个代码,会有不可描述的bug,卧槽。MMP,我是没搞懂,这个声明个方法,怎么还被jquery还是js的库方法调用了。真实可怕。不要用这个了。不然你也会遇到不可描述的错误的。我弄明白了,再更新下文章。

不推荐使用的方法,如下:

Array.prototype.distinct = function (){var arr = this,result = [],len = arr.length;for (var i = 0; i < len; i++) {var bool = arr.indexOf(arr[i],i+1);  //从传入参数的下一个索引值开始寻找是否存在重复if(bool === -1){result.push(arr[i]);}} return result;
 };

大师兄

js去重,然后,不使用呢个Set的,这个跟浏览器的版本有关系,不实在,还是简单点的好。

方法很简单,可能你还会搜索到很多种方法,但是,只要记住个简单到就好了。

我这个地方留个笔记。方便下次使用到时候,直接来自己的文章找就好了。

虽然,上面的方法,在浏览器的console里面测试都是OK的,我在代码里面测试也是OK的,但是他确影响到了我的其他地方的代码。出了莫名其妙的bug。最后,各种debug,发现是我的这个方法是罪魁祸首。卧槽。还是用地下的这个吧。

 

推荐使用的方法,如下:

function myUnique(arr) {var obj = {};return arr.filter(function(item, index, array){return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)})
 }

现在分析一下,上面的不可描述的bug

大师兄

继续在浏览器的console里面调试,我声明了个数组,然后,数组里面有2个值,在后面,使用for循环,来操作这个数组。

可以看到,原来只有2个值的数组,现在竟然循环了三个东西出来。

前2个结果还是预料之中的,但是最后一个,呵呵,卧槽,他怎么会出现呢。这不我刚刚声明的数组嘛。

炸就炸在这了。

这个怎么解释呢?

这个去重的方法,实际上是给js的数组Array这个东西,新添加了个属性,就是咱的呢个方法名称。然后,这个Array,数组,就是个object like,里面存的就是key 以及value,所以,在上面for循环的时候,输出的就是index,以及index对应的值。

这个for循环的写法,js是支持的,但是,咱给Array这个对象添加了个默认的属性---咱呢个方法名称。以及这个key对应的值,就是那个方法体了。这个新添加的属性,默认是可以循环的。

综上所述,咱还是不使用这个方法了吧。


标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。