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

資訊專欄INFORMATION COLUMN

Javascript實(shí)現(xiàn)數(shù)組去重方法及效率對(duì)比

tulayang / 1320人閱讀

摘要:前言其實(shí)網(wǎng)上搜索這些方法一堆堆的,之所以還來寫一遍主要是因?yàn)樽约毫?xí)慣一種之后就忘了其他方法怎么實(shí)現(xiàn),就寫一寫總結(jié)一下,順便做個(gè)測(cè)試看看哪個(gè)效率最高,為了更好展示效果,我會(huì)先總結(jié)認(rèn)為比較好的方法,后面統(tǒng)一測(cè)試。

前言

其實(shí)網(wǎng)上搜索這些方法一堆堆的,之所以還來寫一遍主要是因?yàn)樽约毫?xí)慣一種之后就忘了其他方法怎么實(shí)現(xiàn),就寫一寫總結(jié)一下,順便做個(gè)測(cè)試看看哪個(gè)效率最高,為了更好展示效果,我會(huì)先總結(jié)認(rèn)為比較好的方法,后面統(tǒng)一測(cè)試。(溫馨提示:下文衹是為了簡便,一般情況下不建議寫在原型上,容易污染全局)

一,通過尋找對(duì)象屬性
var ary = [14, 12, 2, 2, 2, 5, 32, 2, 59, 5, 6, 33, 12, 32, 6];
function sortFun1(ary) {
  var obj = {},
    i = 0,
    len = this.length;
  for (; i < len; i++) {
    if (!obj[this[i]]) {
      obj[this[i]] = 1;
      ary.push(this[i]);
    }
  }
  return ary.sort(function (a, b) {
    return a - b
  });
}
console.log(sortFun1(ary));
// [ 2, 2, 2, 2, 5, 5, 6, 6, 12, 12, 14, 32, 32, 33, 59 ]
二,通過尋找數(shù)組位置
var ary = [14, 12, 2, 2, 2, 5, 32, 2, 59, 5, 6, 33, 12, 32, 6];
function sortFun2(ary) {
  var i = 0,
    len = this.length;
  for (; i < len; i++) {
    if (ary.indexOf(this[i]) == -1)
      ary.push(this[i]);
  }
  return ary.sort(function (a, b) {
    return a - b
  });
}
console.log(sortFun2(ary));
// [ 2, 2, 2, 2, 5, 5, 6, 6, 12, 12, 14, 32, 32, 33, 59 ]
三,跟尋找數(shù)組位置類似,搜索數(shù)字第一次出現(xiàn)的位置是不是跟當(dāng)前位置一樣
var ary = [14, 12, 2, 2, 2, 5, 32, 2, 59, 5, 6, 33, 12, 32, 6];
function sortFun3(ary) {
  var i = 0,
    len = this.length;
  for (; i < len; i++) {
    if (this.indexOf(this[i]) == i)
      ary.push(this[i]);
  }
  return ary.sort(function (a, b) {
    return a - b
  });
}
console.log(sortFun3(ary));
// [ 2, 2, 2, 2, 5, 5, 6, 6, 12, 12, 14, 32, 32, 33, 59 ]
四,比較常規(guī),先排序,再比較前后兩個(gè)數(shù)字是不是相等
var ary = [14, 12, 2, 2, 2, 5, 32, 2, 59, 5, 6, 33, 12, 32, 6];
function sortFun4(ary) {
  ary.sort(function (a, b) {
    return a - b
  });
  var i = 0,
    len = this.length;
  for (; i < len; i++) {
    if (this[i] !== this[i - 1])
      ary.push(this[i]);
  }
  return ary;
}
console.log(sortFun4(ary));
// [ 2, 2, 2, 2, 5, 5, 6, 6, 12, 12, 14, 32, 32, 33, 59 ]

接下來是網(wǎng)上比較少的效率比較了,也是本文重點(diǎn),我們先生成一個(gè)隨機(jī)數(shù)組函數(shù)和計(jì)時(shí)函數(shù)統(tǒng)一比較
(溫馨提示:隨機(jī)數(shù)組執(zhí)行一次之后就保存在一個(gè)變量,而每次執(zhí)行函數(shù)花費(fèi)時(shí)間都會(huì)有幾毫秒偏差,你們想看多幾種結(jié)果就狠狠地按按F5就好了,也只能這么搞..)

首先生成一個(gè)一千個(gè)數(shù)字的數(shù)組

function sortFun1(ary) {
  var obj = {},
    i = 0,
    len = this.length;
  for (; i < len; i++) {
    if (!obj[this[i]]) {
      obj[this[i]] = 1;
      ary.push(this[i]);
    }
  }
  return ary.sort(function (a, b) {
    return a - b
  });
}

function sortFun2(ary) {
  var i = 0,
    len = this.length;
  for (; i < len; i++) {
    if (ary.indexOf(this[i]) == -1)
      ary.push(this[i]);
  }
  return ary.sort(function (a, b) {
    return a - b
  });
}


function sortFun3(ary) {
  var i = 0,
    len = this.length;
  for (; i < len; i++) {
    if (this.indexOf(this[i]) == i)
      ary.push(this[i]);
  }
  return ary.sort(function (a, b) {
    return a - b
  });
}


function sortFun4(ary) {
  ary.sort(function (a, b) {
    return a - b
  });
  var i = 0,
    len = this.length;
  for (; i < len; i++) {
    if (this[i] !== this[i - 1])
      ary.push(this[i]);
  }
  return ary;
}

function randomAry(n) {
  var ary = [], i = 0;
  for (; i < n; i++) {
    ary.push(Math.ceil(Math.random() * 10000));
  }
  return ary;
}

function useTime(fn, ary) {
  var start = new Date();
  fn(ary);
  var end = new Date();
  console.log("本次函數(shù)運(yùn)行花了:" + (end - start) + "毫秒");
}


var ary = randomAry(1000000);
useTime(sortFun1, ary);
useTime(sortFun2, ary);
useTime(sortFun3, ary);
useTime(sortFun4, ary);

本次函數(shù)運(yùn)行花了:1毫秒
本次函數(shù)運(yùn)行花了:1毫秒
本次函數(shù)運(yùn)行花了:0毫秒
本次函數(shù)運(yùn)行花了:1毫秒
(嗯,果然現(xiàn)代瀏覽器強(qiáng)大無比,不吐槽舊瀏覽器了)

看看十萬個(gè)數(shù)字

function sortFun1(ary) {
  var obj = {},
    i = 0,
    len = this.length;
  for (; i < len; i++) {
    if (!obj[this[i]]) {
      obj[this[i]] = 1;
      ary.push(this[i]);
    }
  }
  return ary.sort(function (a, b) {
    return a - b
  });
}

function sortFun2(ary) {
  var i = 0,
    len = this.length;
  for (; i < len; i++) {
    if (ary.indexOf(this[i]) == -1)
      ary.push(this[i]);
  }
  return ary.sort(function (a, b) {
    return a - b
  });
}


function sortFun3(ary) {
  var i = 0,
    len = this.length;
  for (; i < len; i++) {
    if (this.indexOf(this[i]) == i)
      ary.push(this[i]);
  }
  return ary.sort(function (a, b) {
    return a - b
  });
}


function sortFun4(ary) {
  ary.sort(function (a, b) {
    return a - b
  });
  var i = 0,
    len = this.length;
  for (; i < len; i++) {
    if (this[i] !== this[i - 1])
      ary.push(this[i]);
  }
  return ary;
}

function randomAry(n) {
  var ary = [], i = 0;
  for (; i < n; i++) {
    ary.push(Math.ceil(Math.random() * 10000));
  }
  return ary;
}

function useTime(fn, ary) {
  var start = new Date();
  fn(ary);
  var end = new Date();
  console.log("本次函數(shù)運(yùn)行花了:" + (end - start) + "毫秒");
}


var ary = randomAry(100000);
useTime(sortFun1, ary);
useTime(sortFun2, ary);
useTime(sortFun3, ary);
useTime(sortFun4, ary);

現(xiàn)在開始出現(xiàn)明顯差距了
本次函數(shù)運(yùn)行花了:65毫秒
本次函數(shù)運(yùn)行花了:4毫秒
本次函數(shù)運(yùn)行花了:4毫秒
本次函數(shù)運(yùn)行花了:5毫秒

看看一百萬個(gè)數(shù)字(數(shù)據(jù)龐大,開始吃不消了,等個(gè)五六秒吧)

function sortFun1(ary) {
  var obj = {},
    i = 0,
    len = this.length;
  for (; i < len; i++) {
    if (!obj[this[i]]) {
      obj[this[i]] = 1;
      ary.push(this[i]);
    }
  }
  return ary.sort(function (a, b) {
    return a - b
  });
}

function sortFun2(ary) {
  var i = 0,
    len = this.length;
  for (; i < len; i++) {
    if (ary.indexOf(this[i]) == -1)
      ary.push(this[i]);
  }
  return ary.sort(function (a, b) {
    return a - b
  });
}


function sortFun3(ary) {
  var i = 0,
    len = this.length;
  for (; i < len; i++) {
    if (this.indexOf(this[i]) == i)
      ary.push(this[i]);
  }
  return ary.sort(function (a, b) {
    return a - b
  });
}


function sortFun4(ary) {
  ary.sort(function (a, b) {
    return a - b
  });
  var i = 0,
    len = this.length;
  for (; i < len; i++) {
    if (this[i] !== this[i - 1])
      ary.push(this[i]);
  }
  return ary;
}

function randomAry(n) {
  var ary = [], i = 0;
  for (; i < n; i++) {
    ary.push(Math.ceil(Math.random() * 10000));
  }
  return ary;
}

function useTime(fn, ary) {
  var start = new Date();
  fn(ary);
  var end = new Date();
  console.log("本次函數(shù)運(yùn)行花了:" + (end - start) + "毫秒");
}


var ary = randomAry(1000000);
useTime(sortFun1, ary);
useTime(sortFun2, ary);
useTime(sortFun3, ary);
useTime(sortFun4, ary);

本次函數(shù)運(yùn)行花了:661毫秒
本次函數(shù)運(yùn)行花了:24毫秒
本次函數(shù)運(yùn)行花了:20毫秒
本次函數(shù)運(yùn)行花了:27毫秒

總結(jié)

數(shù)據(jù)說話,

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

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

相關(guān)文章

  • 最全的數(shù)組去重方法對(duì)比

    摘要:本文最早發(fā)布于,為原創(chuàng)常規(guī)方法兩種數(shù)組深拷貝,為不了影響原來的數(shù)組第一種方法常用但是有坑碰到這種情況就出問題了第二種方法使用,方法返回的結(jié)果并不一定是升序,主要目的是將重復(fù)的數(shù)字排到一起使用的方法兩種簡潔優(yōu)雅版奇技淫巧更新看到評(píng)論 本文最早發(fā)布于csdn,為原創(chuàng) 常規(guī)方法兩種 let json = arr => { let res = [], obj = {};...

    BlackHole1 評(píng)論0 收藏0
  • 跟underscore一起學(xué)數(shù)組去重

    摘要:引子數(shù)組去重是一個(gè)老生常談的話題,在面試中也經(jīng)常會(huì)被問道。其中如果數(shù)組是排序的,去重運(yùn)算效率更高,因?yàn)榕判蚰軌驅(qū)⑾嗤臄?shù)排列在一起,方便前后比較。當(dāng)數(shù)組有序?qū)τ趯?duì)象的去重,我們知道為,所以使用比較對(duì)象在實(shí)際場(chǎng)景中沒有意義。 引子 數(shù)組去重是一個(gè)老生常談的話題,在面試中也經(jīng)常會(huì)被問道。對(duì)于去重,有兩種主流思想: 先排序,線性遍歷后去重,時(shí)間復(fù)雜度O(n*log2n); 使用哈希,空間換...

    flybywind 評(píng)論0 收藏0
  • JS中的數(shù)組去重方法總結(jié)

    摘要:第一種常規(guī)法最直觀的思路創(chuàng)建一個(gè)新數(shù)組如果新數(shù)組中已經(jīng)包含了當(dāng)前的第個(gè)元素,那么跳過否則把當(dāng)前項(xiàng)到新數(shù)組中輸出這種方法用到了方法。特殊情況當(dāng)數(shù)組中既有數(shù)字又有字符串的時(shí)候,如此時(shí)希望和都保留,那么上述的方法無法達(dá)到要求。 第一種:常規(guī)法(最直觀的思路) function unique(arr){ var n = []; //創(chuàng)建一個(gè)新數(shù)組 for(var i = 0; ...

    Aldous 評(píng)論0 收藏0
  • JavaScript 實(shí)現(xiàn)數(shù)組更多的高階函數(shù)

    摘要:實(shí)現(xiàn)數(shù)組更多的高階函數(shù)吾輩的博客原文場(chǎng)景雖說人人平等,但有些人更加平等。若是有一篇適合萌新閱讀的自己實(shí)現(xiàn)數(shù)組更多操作的文章,情況或許會(huì)發(fā)生一些變化。類似于的初始值,但它是一個(gè)函數(shù),避免初始值在所有分組中進(jìn)行累加。 JavaScript 實(shí)現(xiàn)數(shù)組更多的高階函數(shù) 吾輩的博客原文: https://blog.rxliuli.com/p/fc... 場(chǎng)景 雖說人人平等,但有些人更加平等。 為...

    aervon 評(píng)論0 收藏0
  • JS程序

    摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時(shí)候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會(huì)讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識(shí)只有分享才有存在的意義。 是時(shí)候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...

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

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

0條評(píng)論

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