JavaScript數組去重方法匯總

來源:互聯網
上載者:User

標籤:遍曆數組   去重   nbsp   div   indexof   bug   i++   ring   bsp   

1.運用數組的特性

  1.遍曆數組,也遍曆輔助數組,找出兩個數組中是否有相同的項,若有則break,沒有的話就push進去。

  

//第一版本數組去重function unique(arr){    var  res = [],         len = arr.length;    for(let i = 0;i < len; i++){        var reslen = res.length;        for(let j = 0;j < reslen; j++){ //遍曆輔助數組            if(arr[i] === res[j]){                break;            }        }        if(j === reslen){            res.push(arr[i]); //沒有就添加進去        }    }    return res;}

  

  2.運用es5的indexOf方法

//第二版本數組去重 es5文法, IE8不能用function unique(arr){    var len = arr.length,        res = [];    for( let i = 0; i < len ; i++){        let val = arr[i];        if(res.indexOf(val) === -1){ //找不到返回-1            res.push(arr[i]);        }    }    return res;}

  

  3.如果數組已經排好序

function unique(arr){    var len = arr.length;        last,        res = [];    for(let i = 0;i < len; i++){        let val = arr[i];        if(val !== last){ //用last儲存上一次的值            res.push(val);        }        last = val;    }    return res;}

  

  4.留一個介面,傳一個參數判斷數組是否已經排好序

function unique(arr, isSort){    var len = arr.length,        res = [],        last;    if(isSort !== ‘boolean‘){        isSort = false;    }    for(let i = 0;i < len; i++){        var val = arr[i];        if(isSort){            if(!i || val!== last){                res.push(val);            }            last = val;        }else{            if(res.indexOf(val) === -1){                res.push(val);            }        }    }    return res;}

 

  5.如果有特殊需求的話,留一個介面,更靈活

function unique(arr, isSort, fn){    var res = [],        len = arr.length,        newArr = [],        last;    for(let i = 0;i < len; i++){        var val = arr[i],            com = fn ? fn(val, i, arr) : val;        if(isSort){            if(!i || com === last){                res.push(val);            }            last = com;        }else if(fn){            if(newArr.indexOf(com) === -1){                newArr.push(com);                res.push(val);            }        }else if(res.indexOf(val === -1)){            res.push(val);        }    }    return res;}

 

  6.用內部 filter 方法最佳化

function unique(arr){    var res = [],    res = arr.filter(function(item, index, arr){        return res.indexOf(item) === index;  //返回true則添加到數組res,否則不添加    });    return res;}

 

2.運用對象的特性

  1.第一種方法

function unique(arr){    var obj = {},        res = [],    res = arr.filter(function (item, index, aee){        return obj.hasOwnProperty(item) ? false : (obj[item] = true);    });    return res}

 

  注意: 有一個Bug,var  = [ 1,1,"1",2],不能識別number類型的和string類型,添加到對象中都會轉化為string。

  2.第二種方法

 

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

  注意:這裡也有bug,因為typeof的傳回型別,檢測不了對象。

  3.第三種方法

  運用json方法進行最佳化。

function unique(arr){    var obj = {},        res = [],        len = arr.length;    res = arr.filter(function (item, index, arr){        return obj.hasOwnProperty(typeof item + JSON.stringify(item)) ? false : (typeof item + JSON.stringify(item)) = true;    })    return res;}
3.ES6中的Set()對象
function unique(arr){    return [...new Set(arr)];}

JavaScript數組去重方法匯總

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.