js数组去重

js数组去重就是把数组中重复的元素去掉:

[code=”javascript”]
Array.prototype.delRepeat=function(){
var newArray=new Array();
var len=this.length;
for (var i=0;i

[code=”javascript”]
Array.prototype.delRepeat=function(){
var newArray=[];
var provisionalTable = {};
for (var i = 0, item; (item= this[i]) != null; i++) {
if (!provisionalTable[item]) {
newArray.push(item);
provisionalTable[item] = true;
}
}
return newArray;
}
[/code]
就是使用一个临时的provisionalTable对象,将数组的值作为provisionalTable对象的键值,如果相应的值不存在就将这个数组的值push到新数组中。
效率是提高了,但是有个bug,就是假设数组中换用可转换的数字和字符串,比如数组[6,”6″]这时候就好被去掉一个。悲剧,同时求解决方法。

赞(0) 打赏
未经允许不得转载:WEB前端开发 » js数组去重

评论 19

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #-49

    Array.prototype.delRepeat=function(){
    var newArray= [];
    var tmpObj = {};
    var len=this.length;
    for (var i=0;i<len ;i++){
    tmpObj[this[i]]= this[i];
    }
    for(var x in tmpObj) {
    newArray.push[x];
    }
    return newArray;
    }

    路人9年前 (2010-08-03)回复
  2. #-48
  3. #-47

    Array.prototype.delRepeat=function(){
    var newArray=[];
    var provisionalTable = {};
    for (var i = 0, item; (item= this[i]) != null; i++) {
    var s = typeof(item) + item;
    if (!provisionalTable[s]) {
    newArray.push(item);
    provisionalTable[s] = true;
    }
    }
    return newArray;
    }

    acsu9年前 (2010-08-03)回复
  4. #-46

    @acsu 感谢一下!这个方法很好,解决了字符串和数字问题,但是效率和我的第一个差不多,原因可能是for循环中定义变量中typeof操作有关

    9年前 (2010-08-04)回复
  5. #-45

    @路人 感谢一下!这个方法很好,不过有个小bug,应该是:
    Array.prototype.delRepeat=function(){
    var newArray= [];
    var tmpObj = {};
    var len=this.length;
    for (var i=0;i<len ;i++){
    tmpObj[this[i]]= this[i];
    }
    for(var x in tmpObj) {
    newArray.push(x);
    }
    return newArray;
    }
    不过没有解决数字和字符串的转换问题。

    9年前 (2010-08-04)回复
  6. #-44

    结合acsu 和 路人 的方法:
    Array.prototype.delRepeat = function(){
    var newArray = [];
    var tmpObj = {};
    var len = this.length;
    for (var i = 0; i < len; i++) {
    tmpObj[typeof(this[i])+this[i]] = this[i];
    }
    for (var x in tmpObj) {
    newArray.push(tmpObj[x]);
    }
    return newArray;
    }
    效率还是和我第一个两个for的效率差不多!悲剧!

    9年前 (2010-08-04)回复
  7. #-43

    检查:
    provisionalTable[item+1]

    provisionalTable[typeof item + item]

    [item+1] 应该效率稍微高些, 比文中方法 1 效率高, 但是比 2 肯定要低一些, 多了个计算

    a11en9年前 (2010-08-04)回复
  8. #-42

    之前看到的一种做法是在provisionalTable中存储的键值做加法运算。

    Array.prototype.delRepeat=function(){
    var newArray=[];
    var provisionalTable = {};
    for (var i = 0, item; (item= this[i]) != null; i++) {
    if (!provisionalTable[0+item]) {
    newArray.push(item);
    provisionalTable[0+item] = true;
    }
    }
    return newArray;
    }
    但是这样就没办法对对象类型的数据进行去除重复项的操作了。。

    ake9年前 (2010-08-04)回复
  9. #-41

    数组去重有个很需要考虑的东西.如果是
    [{},{},{}]似乎就基本无解了.

    Rekey9年前 (2010-08-06)回复
  10. #-40

    附上我写的代码..

    Array.prototype.delRepeat=function(){
    var newArray=[];
    var provisionalTable = {};
    for (var i = 0, item; (item= this[i]) != null; i++) {
    if (provisionalTable[item] !== item) {
    newArray.push(item);
    provisionalTable[item] = item;
    }
    }
    return newArray;
    }
    var a = [‘6’,6,7,8,9,2,3,5,3,2,5];
    alert(a.delRepeat()[0]+1);

    Rekey9年前 (2010-08-06)回复
  11. #-39

    看后才知道,自己是js菜鸟。还要多加学习

    web前端寒风9年前 (2010-08-08)回复
  12. #-38

    以前做过测试,零时对象方式是效率最高的。
    这是我的方式:
    Array.prototype.unique = function () {
    var temp = new Array();
    this.sort();
    for(i = 0; i < this.length; i++) {
    if( this[i] == this[i+1]) {
    continue;
    }
    temp[temp.length]=this[i];
    }
    return temp;

    }

    sort()可以自定义对比函数,但是效率比较低.
    http://www.webucd.com/archives/168

    网址兽9年前 (2010-08-09)回复
  13. #-37

    不错的讨论,我也写过一篇这方面的文章,互相学习:
    http://www.ilovejs.net/archives/959

    supersha9年前 (2010-08-09)回复
  14. #-36

    Array.prototype.distinct=function(){
    var result=[];
    var provisionalTable = {};
    for (var i = 0, item; (item= this[i]) != null; i++) {
    if (provisionalTable[item]!==item) {
    result.push(item);
    provisionalTable[item] = item;
    }
    }
    return result;
    }
    如果要深层去重,如剔除具有完全相同属性和值的object,代码如下:
    Array.prototype.distinct=function(){
    var result=[];
    function isSame(o1,o2){
    if(!o1||!o2)return false;
    var b=true;
    for(var c in o1){
    if(!o2[c])return false;
    if(typeof o1[c]==”object”){
    b=isSame(o1[c],o2[c]);
    }else if(o1[c]!==o2[c]){
    return false;
    }
    }
    return b;
    }
    var provisionalTable = {};
    for (var i = 0, item; (item= this[i]) != null; i++) {
    if (!isSame(provisionalTable[item],item)) {
    result.push(item);
    provisionalTable[item] = item;
    }
    }
    return result;
    }

    hugh8年前 (2010-10-21)回复
  15. #-35

    我提供一个方法:
    function distinct(arr){
    var self = arr;
    var _a = arr.concat().sort();
    _a.sort(function(a,b){
    if(a === b){
    var n = self.indexOf(a);
    self.splice(n,1);
    }
    });
    return self;
    }

    zhenn8年前 (2010-10-26)回复
  16. #-34

    把if里面判断的条件给改一下,可以改成这样:
    Array.prototype.unique = function () {
    var tempArr = [];
    var tempObj = {};
    for (var i = 0; i < this.length; i++) {
    if (!(this[i] in tempObj) || !(this[i] === tempObj[this[i]])) {
    tempArr.push(this[i]);
    tempObj[this[i]] = this[i]; // 这个可以用保存重复的元素
    }
    }
    return tempArr;
    }
    var test = [1,1,1,1,'1','abc'];
    alert(test.unique());

    fongsi8年前 (2011-03-31)回复
  17. #-33

    这个好,解决了我的一个困扰了很久的问题

    cxybl7年前 (2011-08-30)回复

前端开发相关广告投放 更专业 更精准

联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏