国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

最全的數組去重方法對比

BlackHole1 / 3148人閱讀

摘要:本文最早發布于,為原創常規方法兩種數組深拷貝,為不了影響原來的數組第一種方法常用但是有坑碰到這種情況就出問題了第二種方法使用,方法返回的結果并不一定是升序,主要目的是將重復的數字排到一起使用的方法兩種簡潔優雅版奇技淫巧更新看到評論

本文最早發布于csdn,為原創

常規方法兩種
let json = arr => {
    let res = [],
        obj = {};
    arr.forEach(value => {
        let key = typeof(value) + value;
        !obj.hasOwnProperty(key) && (res.push(value), obj[key] = 1);
    })
    return res;
}

let sort = arr => {
    //數組深拷貝,為不了影響原來的數組
    let newArr = arr.concat();
    newArr.sort();
    for (var i = newArr.length; i > 0; i--) {
        if ( newArr[i] === newArr[ i - 1 ] ) { // use == if "2" eq 2, else ===
            newArr.splice( i, 1 );
        }
    }
    return newArr;
}

第一種方法常用但是有坑

console.log(unique([ new String(1), new Number(1) ]))
//[String]0: String0: "1"length: 1__proto__: String[[PrimitiveValue]]: "1"length: 1__proto__:Array[0]

碰到這種情況就出問題了

第二種方法使用sortsort方法返回的結果并不一定是升序,主要目的是將重復的數字排到一起

使用ES5的indexOf方法兩種
let foreach = arr => {
    arr.forEach(value => {
        res.indexOf(value) == -1 && res.push(value);
    }, res = [])
}
let unique = arr => {
    let res = [];
    arr.forEach(function(value) {
        (res.indexOf(value) == -1) && res.push(value);
    })
    return res;
}
let arr = [1, 1, 2, 2];
unique3(arr);
console.log(res);
簡潔優雅版
let filter = arr => { return arr.filter(function (value, index, array) { return index <= array.indexOf(value);}); };
es6奇技淫巧

2016.7.7更新
看到評論提醒的方法

let array = Array.from(new Set([1, 1, 1, 2, 3, 2, 4]));
console.log(array);
// => [1, 2, 3, 4]

補充說明,from方法現在瀏覽器支持程度不太好,另外經測試,性能也不具有優勢

性能對比

2016.7.12更新,最近發現了一篇文章進行性能測試,覺得很贊,以后測性能就用這個了
benchmark地址

let benchmark = require("benchmark");
let suit = new benchmark.Suite;
let arr = [1, 1, 1, 2, 3, 2, 4];
let es6 = arr => {
    let array = Array.from(new Set(arr));
};

let filter = arr => { 
    arr.filter((value, index, array) => { return index <= array.indexOf(value);}); 
};

let json = arr => {
    let res = [],
        obj = {};
    arr.forEach(value => {
        let key = typeof(value) + value;
        !obj.hasOwnProperty(key) && (res.push(value), obj[key] = 1);
    })
    return res;
}

let sort = arr => {
    //數組深拷貝,為不了影響原來的數組
    let newArr = arr.concat();
    newArr.sort();
    for (var i = newArr.length; i > 0; i--) {
        if ( newArr[i] === newArr[ i - 1 ] ) { // use == if "2" eq 2, else ===
            newArr.splice( i, 1 );
        }
    }
    return newArr;
}

let foreach = arr => {
    arr.forEach(value => {
        res.indexOf(value) == -1 && res.push(value);
    }, res = [])
}

suit.add("es6", function() {
    es6(arr);
}).add("filter", function() {
    filter(arr);
}).add("json", function() {
    json(arr);
}).add("sort", function() {
    sort(arr);
}).add("foreach", function() {
    foreach(arr);
}).on("cycle", function(event) {
    console.log(String(event.target));
}).on("complete", function() {
    console.log("Fastest is " + this.filter("fastest").map("name") + "
 slowest is " + this.filter("slowest").map("name"));
}).run({"async": true});

在teminal運行node test.js得到如下結果

$ node 數組去重方法及對比.js
es6 x 275,353 ops/sec ±4.87% (63 runs sampled)
filter x 703,449 ops/sec ±1.49% (89 runs sampled)
json x 238,876 ops/sec ±5.24% (72 runs sampled)
sort x 217,857 ops/sec ±4.58% (64 runs sampled)
foreach x 915,368 ops/sec ±3.84% (65 runs sampled)
Fastest is foreach
slowest is sort
總結

以上所有方法都不會出現將1和"1"視作一起去重的情況,除開第一種,其他的方法也能區分開[new String(1), new Number(1)],這里的方法已經是比較全,和其他博客比起來只有一些實現上的差異,總體方法思想是一樣的

參考資料

一行代碼實現數組去重(ES6)
從 JavaScript 數組去重談性能優化
js對象的hasOwnProperty為什么比數組的indexof方法在性能上高的多?
使用Benchmark.js和jsPerf分析代碼性能
源代碼github地址

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79933.html

相關文章

  • JavaScript數組去重(12種方法,史上最全

    摘要:數組去重,一般都是在面試的時候才會碰到,一般是要求手寫數組去重方法的代碼。如果是被提問到,數組去重的方法有哪些你能答出其中的種,面試官很有可能對你刮目相看。數組去重的方法一利用去重中最常用不考慮兼容性,這種去重的方法代碼最少。 數組去重,一般都是在面試的時候才會碰到,一般是要求手寫數組去重方法的代碼。如果是被提問到,數組去重的方法有哪些?你能答出其中的10種,面試官很有可能對你刮目相看...

    rozbo 評論0 收藏0
  • 好像不是最全數組去重方法

    摘要:最簡單粗暴地方式,兩重循環兩個因為兩個因為排序,如果相同就會挨著先放數組第一個元素無法判斷對象對象數組去重方法補充我想說一下與相同點他們都是用來遍歷數組的。不同點能有返回值,沒有返回值。 這一篇文章,我們講解一下數組去重。 1.最簡單粗暴地方式,兩重for循環 let arr = [9, 5, 6, 5, 1, 1, true, 5, true]; for (var i = 0; i ...

    AnthonyHan 評論0 收藏0
  • js數組去重幾種方法

    摘要:三種方法利用判斷新數組中實際上也是使用的類似的傳入數組如果當前數組的第已經保存進了臨時數組,那么跳過,否則把當前項到臨時數組里面利用判斷舊數組結果數組如果當前數組的第項在當前數組中第一次出現的位置不是,那么表示第項是重復的,忽略掉。 三種方法 利用indexOf判斷新數組 underscore.js中實際上也是使用的類似的indexOf //傳入數組 functio...

    mykurisu 評論0 收藏0
  • 數組去重各種方法速度對比

    摘要:首先需要一個自動生成數組的函數自動生成數組的函數執行上面函數,的到的數組長度為,因為執行速度很快,只有長度很大時,才能看到各個方法的執行速度的差別注意到不能簡單的用賦值,否則改變后,到也相應改變了七個相同的數組并且數組長度要足夠大才能對比出 首先需要一個自動生成數組的函數 // 自動生成數組的函數 function randomArr (n) { let...

    1treeS 評論0 收藏0
  • 史上最全 Python 3 類型轉換指南

    摘要:支持轉換為類型的,僅有,其他類型均不支持。如果中含有正負號數字和小數點以外的字符,則不支持轉換。轉換時,會自動添加虛數部分并以表示。轉換會直接完全轉換。轉換列表,會取每個字節的十進制值并組合成列表轉換為比較簡單。 int 支持轉換為 int 類型的,僅有 float、str、bytes,其他類型均不支持。 float -> int 會去掉小數點及后面的數值,僅保留整數部分。 int(-...

    libxd 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<