最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javascript中數(shù)組去重與拍平的方法示例

 更新時(shí)間:2017年02月03日 10:19:05   作者:yangchen  
這篇文章主要介紹了Javascript中數(shù)組去重與拍平的相關(guān)資料,因?yàn)檫@是實(shí)際業(yè)務(wù)開發(fā)中經(jīng)常遇到的,文中開始先進(jìn)行了數(shù)組的判斷介紹,因?yàn)樵谔幚頂?shù)組之前判斷數(shù)據(jù)是不是數(shù)組很重要,有需要的朋友可以參考借鑒,下面來一起看看吧。

數(shù)組的判斷

在說如何進(jìn)行數(shù)組的去重和拍平之前,先說一下怎么判斷數(shù)組,因?yàn)橐M(jìn)行數(shù)組的處理當(dāng)然要先判斷下傳過來的數(shù)據(jù)是不是數(shù)組。

首先我們都知道js的數(shù)據(jù)類型只有5種,分別是Undefined、Null、Boolean、Number和String,數(shù)組只是一個(gè)對(duì)象,用typeof([])返回的結(jié)果知識(shí)一個(gè)Object的字符串,因此我們需要通過其他手段來判斷它,這里就說兩種方法。

第一種用instenceof方法

instanceof是ES5提供的一個(gè)方法,它可以用來判斷實(shí)例是否是某個(gè)類的實(shí)例,例如:

[] instenceof Array
//返回結(jié)果是true

這種方法的不好之處就是兼容性不好,對(duì)于一些低版本瀏覽器不支持ES5的就要懵逼了。

第二種方法是通過原型鏈的方式來判斷

了解js的話都應(yīng)該懂得js這個(gè)語言的特點(diǎn)就是原型鏈?zhǔn)降?,所有的?duì)象都繼承自Object.prototype,而prototype上又有toString()方法,這個(gè)toString()方法是干什么用的呢?就是以字符串的形式返回當(dāng)前對(duì)象的值。第一次看可能這句話可能不大明白,舉個(gè)例吧:

var num = 123;
num.toString(); //返回結(jié)果為"123"

有沒有看明白一點(diǎn)?就是返回num這個(gè)對(duì)象值的字符串形式,也就是”123”。好了,這跟判斷數(shù)組有什么關(guān)系?想一下所有的對(duì)象都繼承自Object.prototype,數(shù)組也是啊,如果把一個(gè)數(shù)組送到Object.prototype里作為一個(gè)“值”,在調(diào)用toString()方法,那它應(yīng)該顯示出這個(gè)對(duì)象的名字才對(duì)啊,這就是判斷的原理,代碼如下:

Object.prototype.toString.call([]); //結(jié)果是"[object Array]"

像jQuery這樣的腳本庫的isArray()用的就是這個(gè)方法。

數(shù)組拍平

說完判直奔主題,先是數(shù)組拍平,什么是數(shù)組拍平呢?就是把[1,[2,[3,4],5]]鋪成[1,2,3,4,5]。關(guān)于數(shù)組拍平我有兩種思路,第二種比較奇葩,留點(diǎn)懸念吧哈哈。

第一種是常規(guī)思路

對(duì)數(shù)組進(jìn)行遍歷,如果數(shù)組里面套著數(shù)組就繼續(xù)遍歷里面的,直到把每個(gè)元素都遍歷完,然后一邊遍歷一邊塞入新的數(shù)組變量里,這樣就完成拍平了,具體代碼如下:

panelArr = function(arr){
 var newArr = [];
 var isArray = function(obj) {
  return Object.prototype.toString.call(obj) === '[object Array]';
 };
 var dealArr = function(arr){
  for (var i = 0;i<arr.length;i++){
   isArray(arr[i]) ? dealArr(arr[i]) : newArr.push(arr[i]);
  }
 };
 dealArr(arr);
 return newArr;
};
console.log(panelArr([1,[2,3]])); //[1,2,3]

當(dāng)然這個(gè)方法也可以寫在Array.prototype里,使用起來更方便。這個(gè)方法有個(gè)問題就是內(nèi)存占用上,因?yàn)椴捎眠f歸如果數(shù)據(jù)量大了會(huì)占用大量大量內(nèi)存。

第二種奇葩思路

第二種思路就是不把數(shù)組來看,也不遍歷了直接拍平。聽起來略奇怪,怎么能不遍歷就拍平?就是使用join()方法,將數(shù)組轉(zhuǎn)換成字符串,然后正則去掉符號(hào)最后合并,這個(gè)方法在使用注意不能join("") ,因?yàn)槿绻@樣分割的話,13是1和3還是13?不好區(qū)分,代碼如下:

var arr = [1,2,[33,43],20,19];
arr.join(".").replace(/,/g,".").split("."); //["1", "2", "33", "43", "20", "19"]

注意:這個(gè)方法會(huì)轉(zhuǎn)換數(shù)據(jù)類型成字符串。

數(shù)組去重

下面是數(shù)組去重,舉例來說就是[1,2,3,3,4,5,5,5,6]變成[1,2,3,4,5,6]。這個(gè)實(shí)現(xiàn)的核心就是去重這里,如果能夠快速判斷元素是否重復(fù)就是關(guān)鍵。

還是兩種思路

第一種遍歷的思路

就是準(zhǔn)備一個(gè)新的數(shù)組變量,塞入前每次對(duì)這個(gè)變量進(jìn)行遍歷看看是否有重復(fù)的,如果沒有就塞入,最后生成的新數(shù)組就是去重后的數(shù)組了。示例代碼如下:

function uniqueArr(arr){
 var newArr = [];
 newArr.push(arr[0]);
 for(var i = 1; i<arr.length;i++){
 var repeat = false;
 for(var j = 0;j<newArr.length;j++){
 if(arr[i] == newArr[j]){
 repeat = true;
 }
 }
 if(!repeat){
 newArr.push(arr[i]);
 }
 }
 return newArr;
}

第二種使用哈希判斷

上面那個(gè)時(shí)間復(fù)雜度為O(n^2)的方法并不是什么好方法,它的瓶頸就是判斷是否重復(fù)這里,所以我們換成一個(gè)更高效的檢索是否重復(fù)的方法,這個(gè)方法就是哈希,為什么哈希檢索最快?翻翻數(shù)據(jù)結(jié)構(gòu)吧,這里就不在贅述了。

這個(gè)方法的思路就是在原始數(shù)組和去重?cái)?shù)組之間加入一個(gè)哈希過濾,總的來看就是原數(shù)組數(shù)據(jù)交給哈希,看是否有重復(fù),若是沒有則添加進(jìn)去。具體代碼如下:

function uniqueArr(arr){
 var newArr = [],
 hashFilter = {};
 for(var i = 0;i<arr.length;i++){
 if(!hashFilter[arr[i]]){
 //若不存在將此屬性對(duì)應(yīng)的值改為true,并塞入去重?cái)?shù)組中
 hashFilter[arr[i]] = true;
 newArr.push(arr[i]);
 }
 }
 return newArr;
}

我青睞第二種,因?yàn)樵谂袛嗍欠裰貜?fù)這里真的很快,可以說是秒出。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • 微信小程序?qū)崿F(xiàn)簡單文字跑馬燈

    微信小程序?qū)崿F(xiàn)簡單文字跑馬燈

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)簡單文字跑馬燈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • JS數(shù)組進(jìn)階示例【數(shù)組的幾種函數(shù)用法】

    JS數(shù)組進(jìn)階示例【數(shù)組的幾種函數(shù)用法】

    這篇文章主要介紹了JS數(shù)組進(jìn)階,結(jié)合實(shí)例形式總結(jié)分析了數(shù)組的幾種常見函數(shù)基本用法,涉及JavaScript數(shù)組元素刪除、拼接、添加、倒序排列等相關(guān)操作技巧,需要的朋友可以參考下
    2020-01-01
  • 詳解JavaScript到TypeScript的轉(zhuǎn)換過程

    詳解JavaScript到TypeScript的轉(zhuǎn)換過程

    JavaScript是一門強(qiáng)大而靈活的編程語言,TypeScript作為JavaScript的超集,為開發(fā)人員提供了靜態(tài)類型檢查、更好的協(xié)作能力和面向?qū)ο缶幊痰闹С?,本文將詳?xì)講解如何將JavaScript代碼轉(zhuǎn)換為TypeScript,并寫一些代碼示例參考
    2023-06-06
  • 用js實(shí)現(xiàn)隨機(jī)返回?cái)?shù)組的一個(gè)元素

    用js實(shí)現(xiàn)隨機(jī)返回?cái)?shù)組的一個(gè)元素

    js實(shí)現(xiàn)隨機(jī)返回?cái)?shù)組的一個(gè)元素,這是個(gè)奇妙的方法。適合做標(biāo)題性質(zhì)文字的隨機(jī)輪換顯示
    2007-08-08
  • 代碼詳解JS操作剪貼板

    代碼詳解JS操作剪貼板

    本篇文章給大家介紹了如何用JS操作剪貼板的功能,并把實(shí)例代碼做了分享,需要的朋友學(xué)習(xí)下吧。
    2018-02-02
  • JavaScript避免回調(diào)地獄的策略分享

    JavaScript避免回調(diào)地獄的策略分享

    在JavaScript中,異步操作通常通過回調(diào)函數(shù)來處理,但當(dāng)存在多個(gè)嵌套異步調(diào)用時(shí),就會(huì)出現(xiàn)“回調(diào)地獄”(Callback Hell),避免回調(diào)地獄有助于提升代碼可讀性和可維護(hù)性,并使錯(cuò)誤處理更為集中和規(guī)范,本文小編給大家介紹了JavaScript避免回調(diào)地獄的策略,需要的朋友可以參考下
    2025-03-03
  • css與javascript跨瀏覽器兼容性總結(jié)

    css與javascript跨瀏覽器兼容性總結(jié)

    這篇文章主要介紹了css與javascript跨瀏覽器兼容性,包括常見的css兼容性問題與javascript兼容性問題,以及IE與Firefox等常用瀏覽器的兼容性分析,需要的朋友可以參考下
    2014-09-09
  • js中通過父級(jí)進(jìn)行查找定位元素

    js中通過父級(jí)進(jìn)行查找定位元素

    這篇文章主要介紹了js中如何通過父級(jí)進(jìn)行查找定位元素,需要的朋友可以參考下
    2014-06-06
  • JavaScript獲取DOM元素的多種方法

    JavaScript獲取DOM元素的多種方法

    DOM是 HTML 和 XML 文檔的編程接口,表現(xiàn)為網(wǎng)頁結(jié)構(gòu)的樹狀對(duì)象,每個(gè)對(duì)象對(duì)應(yīng)頁面的一部分,如 HTML 元素,獲取 DOM 元素是交互式網(wǎng)頁開發(fā)的核心,用于修改內(nèi)容、樣式或行為,本文給大家介紹了JavaScript獲取DOM元素的多種方法,需要的朋友可以參考下
    2025-03-03
  • 讓JavaScript 輕松支持函數(shù)重載 (Part 1 - 設(shè)計(jì))

    讓JavaScript 輕松支持函數(shù)重載 (Part 1 - 設(shè)計(jì))

    JavaScript支持函數(shù)重載嗎?可以說不支持,也可以說支持。說不支持,是因?yàn)镴avaScript不能好像其它原生支持函數(shù)重載的語言一樣,直接寫多個(gè)同名函數(shù),讓編譯器來判斷某個(gè)調(diào)用對(duì)應(yīng)的是哪一個(gè)重載。
    2009-08-08

最新評(píng)論

榆树市| 乃东县| 张家口市| 建瓯市| 阿尔山市| 朔州市| 囊谦县| 龙门县| 汤原县| 依兰县| 阿尔山市| 五河县| 四会市| 洱源县| 章丘市| 龙山县| 玛沁县| 宝山区| 伊川县| 高密市| 平定县| 开江县| 沛县| 西藏| 若羌县| 运城市| 普兰县| 驻马店市| 桦甸市| 晋中市| 明溪县| 曲阳县| 乐昌市| 黄大仙区| 成都市| 满城县| 湛江市| 宜兰市| 习水县| 台南市| 拜城县|