摘要:本文最早發(fā)布于,為原創(chuàng)常規(guī)方法兩種數(shù)組深拷貝,為不了影響原來(lái)的數(shù)組第一種方法常用但是有坑碰到這種情況就出問(wèn)題了第二種方法使用,方法返回的結(jié)果并不一定是升序,主要目的是將重復(fù)的數(shù)字排到一起使用的方法兩種簡(jiǎn)潔優(yōu)雅版奇技淫巧更新看到評(píng)論
本文最早發(fā)布于csdn,為原創(chuàng)
常規(guī)方法兩種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 => { //數(shù)組深拷貝,為不了影響原來(lái)的數(shù)組 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]
碰到這種情況就出問(wèn)題了
第二種方法使用sort,sort方法返回的結(jié)果并不一定是升序,主要目的是將重復(fù)的數(shù)字排到一起
使用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);簡(jiǎn)潔優(yōu)雅版
let filter = arr => { return arr.filter(function (value, index, array) { return index <= array.indexOf(value);}); };es6奇技淫巧
2016.7.7更新
看到評(píng)論提醒的方法
let array = Array.from(new Set([1, 1, 1, 2, 3, 2, 4])); console.log(array); // => [1, 2, 3, 4]
補(bǔ)充說(shuō)明,from方法現(xiàn)在瀏覽器支持程度不太好,另外經(jīng)測(cè)試,性能也不具有優(yōu)勢(shì)
性能對(duì)比2016.7.12更新,最近發(fā)現(xiàn)了一篇文章進(jìn)行性能測(cè)試,覺(jué)得很贊,以后測(cè)性能就用這個(gè)了
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 => { //數(shù)組深拷貝,為不了影響原來(lái)的數(shù)組 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運(yùn)行node test.js得到如下結(jié)果
$ node 數(shù)組去重方法及對(duì)比.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總結(jié)
以上所有方法都不會(huì)出現(xiàn)將1和"1"視作一起去重的情況,除開(kāi)第一種,其他的方法也能區(qū)分開(kāi)[new String(1), new Number(1)],這里的方法已經(jīng)是比較全,和其他博客比起來(lái)只有一些實(shí)現(xiàn)上的差異,總體方法思想是一樣的
參考資料一行代碼實(shí)現(xiàn)數(shù)組去重(ES6)
從 JavaScript 數(shù)組去重談性能優(yōu)化
js對(duì)象的hasOwnProperty為什么比數(shù)組的indexof方法在性能上高的多?
使用Benchmark.js和jsPerf分析代碼性能
源代碼github地址
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/79933.html
摘要:數(shù)組去重,一般都是在面試的時(shí)候才會(huì)碰到,一般是要求手寫(xiě)數(shù)組去重方法的代碼。如果是被提問(wèn)到,數(shù)組去重的方法有哪些你能答出其中的種,面試官很有可能對(duì)你刮目相看。數(shù)組去重的方法一利用去重中最常用不考慮兼容性,這種去重的方法代碼最少。 數(shù)組去重,一般都是在面試的時(shí)候才會(huì)碰到,一般是要求手寫(xiě)數(shù)組去重方法的代碼。如果是被提問(wèn)到,數(shù)組去重的方法有哪些?你能答出其中的10種,面試官很有可能對(duì)你刮目相看...
摘要:最簡(jiǎn)單粗暴地方式,兩重循環(huán)兩個(gè)因?yàn)閮蓚€(gè)因?yàn)榕判?,如果相同就?huì)挨著先放數(shù)組第一個(gè)元素?zé)o法判斷對(duì)象對(duì)象數(shù)組去重方法補(bǔ)充我想說(shuō)一下與相同點(diǎn)他們都是用來(lái)遍歷數(shù)組的。不同點(diǎn)能有返回值,沒(méi)有返回值。 這一篇文章,我們講解一下數(shù)組去重。 1.最簡(jiǎn)單粗暴地方式,兩重for循環(huán) let arr = [9, 5, 6, 5, 1, 1, true, 5, true]; for (var i = 0; i ...
摘要:三種方法利用判斷新數(shù)組中實(shí)際上也是使用的類(lèi)似的傳入數(shù)組如果當(dāng)前數(shù)組的第已經(jīng)保存進(jìn)了臨時(shí)數(shù)組,那么跳過(guò),否則把當(dāng)前項(xiàng)到臨時(shí)數(shù)組里面利用判斷舊數(shù)組結(jié)果數(shù)組如果當(dāng)前數(shù)組的第項(xiàng)在當(dāng)前數(shù)組中第一次出現(xiàn)的位置不是,那么表示第項(xiàng)是重復(fù)的,忽略掉。 三種方法 利用indexOf判斷新數(shù)組 underscore.js中實(shí)際上也是使用的類(lèi)似的indexOf //傳入數(shù)組 functio...
摘要:首先需要一個(gè)自動(dòng)生成數(shù)組的函數(shù)自動(dòng)生成數(shù)組的函數(shù)執(zhí)行上面函數(shù),的到的數(shù)組長(zhǎng)度為,因?yàn)閳?zhí)行速度很快,只有長(zhǎng)度很大時(shí),才能看到各個(gè)方法的執(zhí)行速度的差別注意到不能簡(jiǎn)單的用賦值,否則改變后,到也相應(yīng)改變了七個(gè)相同的數(shù)組并且數(shù)組長(zhǎng)度要足夠大才能對(duì)比出 首先需要一個(gè)自動(dòng)生成數(shù)組的函數(shù) // 自動(dòng)生成數(shù)組的函數(shù) function randomArr (n) { let...
摘要:支持轉(zhuǎn)換為類(lèi)型的,僅有,其他類(lèi)型均不支持。如果中含有正負(fù)號(hào)數(shù)字和小數(shù)點(diǎn)以外的字符,則不支持轉(zhuǎn)換。轉(zhuǎn)換時(shí),會(huì)自動(dòng)添加虛數(shù)部分并以表示。轉(zhuǎn)換會(huì)直接完全轉(zhuǎn)換。轉(zhuǎn)換列表,會(huì)取每個(gè)字節(jié)的十進(jìn)制值并組合成列表轉(zhuǎn)換為比較簡(jiǎn)單。 int 支持轉(zhuǎn)換為 int 類(lèi)型的,僅有 float、str、bytes,其他類(lèi)型均不支持。 float -> int 會(huì)去掉小數(shù)點(diǎn)及后面的數(shù)值,僅保留整數(shù)部分。 int(-...
閱讀 2612·2021-09-24 10:29
閱讀 3894·2021-09-22 15:46
閱讀 2632·2021-09-04 16:41
閱讀 3039·2019-08-30 15:53
閱讀 1329·2019-08-30 14:24
閱讀 3117·2019-08-30 13:19
閱讀 2237·2019-08-29 14:17
閱讀 3584·2019-08-29 12:55