亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript數(shù)組去重的6個方法

 更新時間:2017年01月21日 10:55:48   作者:艾瑞卡  
本篇文章主要介紹了JavaScript數(shù)組去重的6個方法。具有一定的參考價值,下面跟著小編一起來看下吧

方法一

無需思考,我們可以得到 O(n^2) 復雜度的解法。定義一個變量數(shù)組 res 保存結(jié)果,遍歷需要去重的數(shù)組,如果該元素已經(jīng)存在在 res 中了,則說明是重復的元素,如果沒有,則放入 res 中。

 function unique(a) {
 var res = [];
 for (var i = 0, len = a.length; i < len; i++) {
 var item = a[i];
 for (var j = 0, jLen = res.length; j < jLen; j++) {
 if (res[j] === item)
 break;
 }
 if (j === jLen)
 res.push(item);
 }
 return res;
}
var a = [1, 1, '1', '2', 1];
var ans = unique(a);
console.log(ans); // => [1, "1", "2"]

代碼非常簡單,那么是否能更簡潔些?如果不考慮瀏覽器兼容,我們可以用 ES5 提供的 Array.prototype.indexOf 方法來簡化代碼。

function unique(a) {
 var res = [];
 for (var i = 0, len = a.length; i < len; i++) {
 var item = a[i];
 (res.indexOf(item) === -1) && res.push(item);
 }
 return res;
}
var a = [1, 1, '1', '2', 1];
var ans = unique(a);
console.log(ans); // => [1, "1", "2"]

既然用了 indexOf,那么不妨再加上 filter。

function unique(a) {
 var res = a.filter(function(item, index, array) {
 return array.indexOf(item) === index;
 });
 return res;
}
var a = [1, 1, '1', '2', 1];
var ans = unique(a);
console.log(ans); // => [1, "1", "2"]

方法二

法一是將原數(shù)組中的元素和結(jié)果數(shù)組中的元素一一比較,我們可以換個思路,將原數(shù)組中重復元素的最后一個元素放入結(jié)果數(shù)組中。

function unique(a) {
 var res = a.filter(function(item, index, array) {
 return array.indexOf(item) === index;
 });
 return res;
}
var a = [1, 1, '1', '2', 1];
var ans = unique(a);
console.log(ans); // => [1, "1", "2"]

雖然復雜度還是 O(n^2),但是可以看到結(jié)果不同,1 出現(xiàn)在了數(shù)組最后面,因為結(jié)果數(shù)組取的是元素最后一次出現(xiàn)的位置。

方法三(sort)

如果筆試面試時只答出了上面這樣 O(n^2) 的方案,可能還不能使面試官滿意,下面就來說幾種進階方案。

將數(shù)組用 sort 排序后,理論上相同的元素會被放在相鄰的位置,那么比較前后位置的元素就可以了。

function unique(a) {
 return a.concat().sort().filter(function(item, pos, ary) {
 return !pos || item != ary[pos - 1];
 });
}
var a = [1, 1, 3, 2, 1, 2, 4];
var ans = unique(a);
console.log(ans); // => [1, 2, 3, 4]

但是問題又來了,1 和 "1" 會被排在一起,不同的 Object 會被排在一起,因為它們 toString() 的結(jié)果相同,所以會出現(xiàn)這樣的錯誤:

function unique(a) {
 return a.concat().sort().filter(function(item, pos, ary) {
 return !pos || item != ary[pos - 1];
 });
}
var a = [1, 1, 3, 2, 1, 2, 4, '1'];
var ans = unique(a);
console.log(ans); // => [1, 2, 3, 4]

當然你完全可以針對數(shù)組中可能出現(xiàn)的不同類型,來寫這個比較函數(shù)。不過這似乎有點麻煩。

方法四 (object)

用 JavaScript 中的 Object 對象來當做哈希表,這也是幾年前筆試時的解法,跟 sort 一樣,可以去重完全由 Number 基本類型組成的數(shù)組。

function unique(a) {
 var seen = {};
 return a.filter(function(item) {
 return seen.hasOwnProperty(item) ? false : (seen[item] = true);
 });
}
var a = [1, 1, 3, 2, 1, 2, 4];
var ans = unique(a);
console.log(ans); // => [1, 3, 2, 4]

還是和方法三一樣的問題,因為 Object 的 key 值都是 String 類型,所以對于 1 和 "1" 無法分別,我們可以稍微改進下,將類型也存入 key 中。

function unique(a) {
 var ret = [];
 var hash = {};
 for (var i = 0, len = a.length; i < len; i++) {
 var item = a[i];
 var key = typeof(item) + item;
 if (hash[key] !== 1) {
 ret.push(item);
 hash[key] = 1;
 }
 }
 return ret;
}
var a = [1, 1, 3, 2, '4', 1, 2, 4, '1'];
var ans = unique(a);
console.log(ans); // => [1, 3, 2, "4", 4, "1"]

雖然解決了討厭的 1 和 "1" 的問題,但是還有別的問題!

function unique(a) {
 var ret = [];
 var hash = {};
 for (var i = 0, len = a.length; i < len; i++) {
 var item = a[i];
 var key = typeof(item) + item;
 if (hash[key] !== 1) {
 ret.push(item);
 hash[key] = 1;
 }
 }
 return ret;
}
var a = [{name: "hanzichi"}, {age: 30}, new String(1), new Number(1)];
var ans = unique(a);
console.log(ans); // => [Object, String]

但是如果數(shù)組元素全部是基礎(chǔ)類型的 Number 值,鍵值對法應該是最高效的!

方法五 (ES6)

ES6 部署了 Set 以及 Array.from 方法,太強大了!如果瀏覽器支持,完全可以這樣:

function unique(a) {
 return Array.from(new Set(a));
}
var a = [{name: "hanzichi"}, {age: 30}, new String(1), new Number(1)];
var ans = unique(a);
console.log(ans); // => [Object, Object, String, Number]

_.unique

最后來看看 underscore 對此的實現(xiàn)方式,underscore 將此封裝到了 _.unique 方法中,調(diào)用方式為 _.unique(array, [isSorted], [iteratee])。其中第一個參數(shù)是必須的,是需要去重的數(shù)組,第二個參數(shù)可選,如果數(shù)組有序,則可以傳入布爾值 true,第三個參數(shù)可選,如果需要對數(shù)組迭代的結(jié)果去重,則可以傳入一個迭代函數(shù)。而數(shù)組元素去重是基于 === 運算符的。

其實很簡單,underscore 中的實現(xiàn)方式和上面的方法一相似。

我們來看它的核心代碼:

for (var i = 0, length = getLength(array); i < length; i++) {
 var value = array[i],
 // 如果指定了迭代函數(shù)
 // 則對數(shù)組每一個元素進行迭代
 computed = iteratee ? iteratee(value, i, array) : value;
 // 如果是有序數(shù)組,則當前元素只需跟上一個元素對比即可
 // 用 seen 變量保存上一個元素
 if (isSorted) {
 // 如果 i === 0,則直接 push
 // 否則比較當前元素是否和前一個元素相等
 if (!i || seen !== computed) result.push(value);
 // seen 保存當前元素,供下一次對比
 seen = computed;
 } else if (iteratee) {
 // 如果 seen[] 中沒有 computed 這個元素值
 if (!_.contains(seen, computed)) {
 seen.push(computed);
 result.push(value);
 }
 } else if (!_.contains(result, value)) { 
 // 如果不用經(jīng)過迭代函數(shù)計算,也就不用 seen[] 變量了
 result.push(value);
 }
}

外面的循環(huán)遍歷數(shù)組元素,對于每個元素,如果數(shù)組有序,則和前一個元素比較,如果相同,則已經(jīng)出現(xiàn)過,不加入到結(jié)果數(shù)組中,否則則加入。而如果有迭代函數(shù),則計算傳入迭代函數(shù)后的值,對值去重,調(diào)用 .contains 方法,而該方法的核心就是調(diào)用.indexOf 方法,和我們上面說的方法一異曲同工。

 以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • 在小程序中使用canvas的方法示例

    在小程序中使用canvas的方法示例

    這篇文章主要介紹了在小程序中使用canvas的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • 原生JS輪播圖插件

    原生JS輪播圖插件

    本文主要介紹了原生JS輪播圖插件。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • BootStrap給table表格的每一行添加一個按鈕事件

    BootStrap給table表格的每一行添加一個按鈕事件

    這篇文章主要介紹了BootStrap給table表格的每一行添加一個按鈕事件的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • 微信小程序 flexbox layout快速實現(xiàn)基本布局的解決方案

    微信小程序 flexbox layout快速實現(xiàn)基本布局的解決方案

    flexbox layout 彈性盒子布局。彈性盒子可以快速的對小程序進行布局。這篇文章主要介紹了微信小程序 flexbox layout快速實現(xiàn)基本布局的方法,需要的朋友可以參考下
    2020-03-03
  • 無阻塞加載js,防止因js加載不了影響頁面顯示的問題

    無阻塞加載js,防止因js加載不了影響頁面顯示的問題

    下面小編就為大家?guī)硪黄獰o阻塞加載js,防止因js加載不了影響頁面顯示的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來
    2016-12-12
  • d3.js中冷門卻實用的內(nèi)置函數(shù)總結(jié)

    d3.js中冷門卻實用的內(nèi)置函數(shù)總結(jié)

    D3.js是一個JavaScript庫,它可以通過數(shù)據(jù)來操作文檔。D3可以通過使用HTML、SVG和CSS把數(shù)據(jù)鮮活形象地展現(xiàn)出來。d3.js其實提供了很多內(nèi)置的函數(shù),可以卻被大家忽略了,下面這篇文章就來給大家詳細介紹了d3.js中冷門卻實用的一些內(nèi)置函數(shù),需要的朋友可以參考借鑒。
    2017-02-02
  • javascript實現(xiàn)依次輸入input自動定焦

    javascript實現(xiàn)依次輸入input自動定焦

    這篇文章主要介紹了javascript實現(xiàn)依次輸入input自動定焦的方法及示例代碼,非常實用,這里推薦給小伙伴們
    2014-12-12
  • JavaScript繼承的三種方法實例

    JavaScript繼承的三種方法實例

    這篇文章主要給大家介紹了關(guān)于JavaScript繼承的三種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • javascript實現(xiàn)異形滾動輪播

    javascript實現(xiàn)異形滾動輪播

    這篇文章主要為大家詳細介紹了javascript實現(xiàn)異形滾動輪播,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • HTML在線編輯器的基本概念與相關(guān)資料

    HTML在線編輯器的基本概念與相關(guān)資料

    HTML在線編輯器的基本概念與相關(guān)資料...
    2007-03-03

最新評論