成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS基礎(chǔ)篇--JS實(shí)現(xiàn)數(shù)組去重方法整理

fjcgreat / 3137人閱讀

摘要:使用進(jìn)行操作,如下但是得到的其實(shí)是一個(gè)非常規(guī)的數(shù)組了,也就是說(shuō)其實(shí)主要是用于對(duì)對(duì)象屬性的操作。這確實(shí)要根據(jù)自己的需求來(lái)了。當(dāng)然簡(jiǎn)單的實(shí)現(xiàn)如下好了到了這兒,我們開(kāi)始總結(jié)下常用的數(shù)組去重的方法。

前言

我們先來(lái)看下面的例子,當(dāng)然來(lái)源與網(wǎng)絡(luò),地址《刪除數(shù)組中多個(gè)不連續(xù)的數(shù)組元素的正確姿勢(shì)》

我們現(xiàn)在將數(shù)組中所有的‘a(chǎn)’元素刪除:

var arr = ["a", "a", "b", "c", "d", "a", "a", "e", "g", "a", "f"];
arr.forEach(function(value, index) {
    value === "a" ? arr.splice(index, 1) : "";
})
console.log(arr); //["a", "b", "c", "d", "a", "e", "g", "f"]

只要相鄰的‘ a’ 元素, 都沒(méi)被刪除,splice不但可以刪除元素本身, 還同時(shí)可以減少數(shù)組長(zhǎng)度( 就是抹去一切痕跡),
這樣導(dǎo)致后續(xù)的數(shù)組元素會(huì)代替已經(jīng)刪除的元素的位置, 但是循環(huán)是按照數(shù)組的下標(biāo)按順序刪除, 這樣就會(huì)漏掉遷移的元素。

使用delete進(jìn)行操作,如下:

var arr = ["a", "a", "b", "c", "d", "a", "a", "e", "g", "a", "f"];
arr.forEach(function(value, index) {
   value === "a" ? delete arr[index] : "";
})
console.log(arr); //[2: "b", 3: "c", 4: "d", 7: "e", 8: "g", 10: "f"]

但是得到的arr其實(shí)是一個(gè)非常規(guī)的數(shù)組了,也就是說(shuō)其實(shí)delete主要是用于對(duì)對(duì)象屬性的操作。這確實(shí)要根據(jù)自己的需求來(lái)了。

當(dāng)然簡(jiǎn)單的實(shí)現(xiàn)如下:

var arr = ["a", "a", "b", "c", "d", "a", "a", "e", "g", "a", "f"];
var newArr = arr.filter(function(key) {
    return key !== "a"

})
console.log(newArr); //["b", "c", "d", "e", "g", "f"]

好了到了這兒,我們開(kāi)始總結(jié)下常用的數(shù)組去重的方法。

方法一:

雙層循環(huán),外層循環(huán)元素,內(nèi)層循環(huán)時(shí)比較值
如果有相同的值則跳過(guò),不相同則push進(jìn)數(shù)組

Array.prototype.distinct = function(){
    var arr = this,
        result = [],
        i,
        j,
        len = arr.length;

    for(i = 0; i < len; i++){
        for(j = i + 1; j < len; j++){
            if(arr[i] === arr[j]){
                j = ++i;
            }
        }
        result.push(arr[i]);
    }
    return result;
}
var arra = [1,2,3,4,4,1,1,2,1,1,1];
arra.distinct();             //返回[3,4,2,1]
方法二:利用splice直接在原數(shù)組進(jìn)行操作

雙層循環(huán),外層循環(huán)元素,內(nèi)層循環(huán)時(shí)比較值
值相同時(shí),則刪去這個(gè)值
注意點(diǎn):刪除元素之后,需要將數(shù)組的長(zhǎng)度也減1.

Array.prototype.distinct = function (){
    var arr = this,
        i,
        j,
        len = arr.length;

    for(i = 0; i < len; i++){
        for(j = i + 1; j < len; j++){
            if(arr[i] == arr[j]){
                arr.splice(j,1);
                len--;
                j--;
            }
        }
    }
    return arr;
};

var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,];
var b = a.distinct();
console.log(b.toString()); //1,2,3,4,5,6,56

優(yōu)點(diǎn):簡(jiǎn)單易懂
缺點(diǎn):占用內(nèi)存高,速度慢

方法三:利用對(duì)象的屬性不能相同的特點(diǎn)進(jìn)行去重
Array.prototype.distinct = function (){
    var arr = this,
        i,
        obj = {},
        result = [],
        len = arr.length;

    for(i = 0; i< arr.length; i++){
        if(!obj[arr[i]]){    //如果能查找到,證明數(shù)組元素重復(fù)了
            obj[arr[i]] = 1;
            result.push(arr[i]);
        }
    }
    return result;
};

var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,];
var b = a.distinct();
console.log(b.toString()); //1,2,3,4,5,6,56
方法四:數(shù)組遞歸去重

運(yùn)用遞歸的思想
先排序,然后從最后開(kāi)始比較,遇到相同,則刪除

Array.prototype.distinct = function (){
    var arr = this,
        len = arr.length;

    arr.sort(function(a,b){        //對(duì)數(shù)組進(jìn)行排序才能方便比較
        return a - b;
    })

    function loop(index){
        if(index >= 1){
            if(arr[index] === arr[index-1]){
                arr.splice(index,1);
            }
            loop(index - 1);    //遞歸loop函數(shù)進(jìn)行去重
        }
    }
    loop(len-1);

    return arr;
};

var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,56,45,56];
var b = a.distinct();
console.log(b.toString());        //1,2,3,4,5,6,45,56
方法五:利用indexOf以及forEach

首先如果你的瀏覽器是低版本不支持indexOfforEach方法,那么可以先先對(duì)瀏覽器Array對(duì)象進(jìn)行支持indexOf和forEach的polyfill

Array.prototype.indexOf = Array.prototype.indexOf || function(item) {
    for (var i = 0, j = this.length; i < j; i++) {
        if (this[i] === item) {
            return i;
        }
    }
    return -1;
}

Array.prototype.forEach = Array.prototype.forEach || function(callback, thisArg) {
    if (!callback || typeof callback !== "function") return;

    for (var i = 0, j = this.length; i < j; i++) {
        callback.call(thisArg, this[i], i, this);
    }
}

去重方法:

Array.prototype.distinct = function (){
    var arr = this,
        result = [],
        len = arr.length;

    arr.forEach(function(v, i ,arr){        //這里利用map,filter方法也可以實(shí)現(xiàn)
        var bool =  arr.indexOf(v,i+1);        //從傳入?yún)?shù)的下一個(gè)索引值開(kāi)始尋找是否存在重復(fù)
        if(bool === -1){
            result.push(v);
        }
    })

    return result;
};

var a = [1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,2,3,3,2,2,1,23,1,23,2,3,2,3,2,3];
var b = a.distinct();
console.log(b.toString());    //1,23,2,3
方法六:數(shù)組下標(biāo)判斷法, 遍歷數(shù)組,利用indexOf判斷元素的值是否與當(dāng)前索引相等,如相等則加入
Array.prototype.distinct = function (){
    var arr = this,
        ret = [];

    arr.forEach(function(e, i, array) {
        if (array.indexOf(e) === i) {
            ret.push(e);
        }
    });

    return ret;
};

var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,];
var b = a.distinct();
console.log(b.toString()); //1,2,3,4,5,6,56
方法七:利用ES6的set

Set數(shù)據(jù)結(jié)構(gòu),它類(lèi)似于數(shù)組,其成員的值都是唯一的。
利用Array.from將Set結(jié)構(gòu)轉(zhuǎn)換成數(shù)組

function dedupe(array){
    return Array.from(new Set(array));
}

dedupe([1,1,2,3]) //[1,2,3]

拓展運(yùn)算符(...)內(nèi)部使用for...of循環(huán)

let arr = [1,2,3,3];
let resultarr = [...new Set(arr)];   
console.log(resultarr);  //[1,2,3]

當(dāng)然以上方法可以不用寫(xiě)到Array的原型上,多帶帶寫(xiě)一個(gè)方法,傳遞數(shù)組當(dāng)參數(shù)也是可以的。

參考地址:http://www.cnblogs.com/leonwang/p/4845576.html

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90311.html

相關(guān)文章

  • JavasScript重難點(diǎn)知識(shí)

    摘要:忍者級(jí)別的函數(shù)操作對(duì)于什么是匿名函數(shù),這里就不做過(guò)多介紹了。我們需要知道的是,對(duì)于而言,匿名函數(shù)是一個(gè)很重要且具有邏輯性的特性。通常,匿名函數(shù)的使用情況是創(chuàng)建一個(gè)供以后使用的函數(shù)。 JS 中的遞歸 遞歸, 遞歸基礎(chǔ), 斐波那契數(shù)列, 使用遞歸方式深拷貝, 自定義事件添加 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果...

    forsigner 評(píng)論0 收藏0
  • JS基礎(chǔ)入門(mén)(十五)—數(shù)組去重

    摘要:目的把數(shù)組中重復(fù)的內(nèi)容去掉。思路每次取出數(shù)組一項(xiàng)和其他的所有項(xiàng)比較如果比較有相同的把重復(fù)的這個(gè)后面的刪掉。是位置,表示長(zhǎng)度。改進(jìn)思路三鍵名是數(shù)據(jù)類(lèi)型的前三位組成的字符串。思路四使用的方法可以去除數(shù)組內(nèi)重復(fù)的表明展開(kāi)數(shù)組的每一項(xiàng) 目的:把數(shù)組中重復(fù)的內(nèi)容去掉。eg:將數(shù)組[2, 3, 1, 4, 2, 2, 3, 4, 1, 5,1]變成[2, 3, 1, 4, 5, 1]。 思路1: ...

    Youngdze 評(píng)論0 收藏0
  • JS基礎(chǔ)入門(mén)(十五)—數(shù)組去重

    摘要:目的把數(shù)組中重復(fù)的內(nèi)容去掉。思路每次取出數(shù)組一項(xiàng)和其他的所有項(xiàng)比較如果比較有相同的把重復(fù)的這個(gè)后面的刪掉。是位置,表示長(zhǎng)度。改進(jìn)思路三鍵名是數(shù)據(jù)類(lèi)型的前三位組成的字符串。思路四使用的方法可以去除數(shù)組內(nèi)重復(fù)的表明展開(kāi)數(shù)組的每一項(xiàng) 目的:把數(shù)組中重復(fù)的內(nèi)容去掉。eg:將數(shù)組[2, 3, 1, 4, 2, 2, 3, 4, 1, 5,1]變成[2, 3, 1, 4, 5, 1]。 思路1: ...

    Yi_Zhi_Yu 評(píng)論0 收藏0
  • JS基礎(chǔ)入門(mén)(十五)—數(shù)組去重

    摘要:目的把數(shù)組中重復(fù)的內(nèi)容去掉。思路每次取出數(shù)組一項(xiàng)和其他的所有項(xiàng)比較如果比較有相同的把重復(fù)的這個(gè)后面的刪掉。是位置,表示長(zhǎng)度。改進(jìn)思路三鍵名是數(shù)據(jù)類(lèi)型的前三位組成的字符串。思路四使用的方法可以去除數(shù)組內(nèi)重復(fù)的表明展開(kāi)數(shù)組的每一項(xiàng) 目的:把數(shù)組中重復(fù)的內(nèi)容去掉。eg:將數(shù)組[2, 3, 1, 4, 2, 2, 3, 4, 1, 5,1]變成[2, 3, 1, 4, 5, 1]。 思路1: ...

    YacaToy 評(píng)論0 收藏0
  • 【重溫基礎(chǔ)】11.Map和Set對(duì)象

    摘要:本文是重溫基礎(chǔ)系列文章的第十一篇。返回一個(gè)布爾值,表示該值是否為的成員。使用回調(diào)函數(shù)遍歷每個(gè)成員。與數(shù)組相同,對(duì)每個(gè)成員執(zhí)行操作,且無(wú)返回值。 本文是 重溫基礎(chǔ) 系列文章的第十一篇。 今日感受:注意身體,生病花錢(qián)又難受。 系列目錄: 【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理) 【重溫基礎(chǔ)】1.語(yǔ)法和數(shù)據(jù)類(lèi)型 【重溫基礎(chǔ)】2.流程控制和錯(cuò)誤處理 【重溫基礎(chǔ)】3....

    meteor199 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<