摘要:很容易給出的方案是當(dāng)給定數(shù)組變成時(shí),發(fā)現(xiàn)結(jié)果依然還是,而實(shí)際上我們期待的結(jié)果應(yīng)該是。為了解決這個(gè)問(wèn)題,遍歷數(shù)組元素,與已保存的元素對(duì)比的時(shí)候還應(yīng)該考慮元素的類型,如下這樣就得到了我們想要的結(jié)果。
很容易給出的方案是:
function arrayUnique(target) { var result = [target[0]]; var temp = {}; temp[target[0]] = true; for (var i = 1, len = target.length; i < len; i++) { if(temp[target[i]] === undefined) { result.push(target[i]); temp[target[i]] = true; } } return result; } arrayUnique([1, 2, 3, 4]); // [1, 2, 3, 4] arrayUnique([1, 2, 3, 4, "1"]); // [1, 2, 3, 4]
當(dāng)給定數(shù)組變成[1, 2, 3, 4, "1"]時(shí),發(fā)現(xiàn)結(jié)果依然還是 [1, 2, 3, 4],而實(shí)際上我們期待的結(jié)果應(yīng)該是[1, 2, 3, 4, "1"]。
原因很簡(jiǎn)單,Object 會(huì)將屬性的 key 值都轉(zhuǎn)成 String 類型,比如,
var a = {1: 3, "3": 9} Object.getOwnPropertyNames(a) // ["1", "3"]
上述例子中,兩個(gè) key 值都被轉(zhuǎn)換成了字符串,再看一下下面一個(gè)例子:
var a = { 1: 3, "3": 9 } Object.prototype.toString = function() { return 3; } console.log(a[{k: 1}]); // 9
當(dāng) key 值是一個(gè)object 的時(shí)候, 會(huì)先調(diào)用 toString 將該 object 轉(zhuǎn)成 字符串,再查找。
為了解決這個(gè)問(wèn)題,遍歷數(shù)組元素,與已保存的元素對(duì)比的時(shí)候還應(yīng)該考慮元素的類型,如下:
function arrayUnique(target) { var result = [target[0]]; var temp = {}; temp[target[0]] = {}; temp[target[0]][(typeof target[0])] = 1; for (var i = 1, targetLen = target.length; i < targetLen; i++) { console.log(temp[target[i]], typeof target[i], temp[target[i]][typeof target[i]]); if(temp[target[i]] && temp[target[i]][typeof target[i]] === 1) { continue; } result.push(target[i]); if(typeof temp[target[i]] === "undefined") { temp[target[i]] = {}; temp[target[i]][typeof target[i]] = 1; } else { temp[target[i]][typeof target[i]] = 1; } } return result; } arrayUnique([1, "1", 1, 5, "5"); // [1, "1", 5, "5"]
這樣就得到了我們想要的結(jié)果。有人會(huì)考慮temp對(duì)象自帶了一個(gè)__proto__和length屬性,可能在比較中會(huì)對(duì)結(jié)果造成影響。但在測(cè)試中,這兩個(gè)屬性只能通過(guò)點(diǎn)方法獲取,比如temp.__proto__, temp.length,而我們實(shí)際比較中使用的是方括號(hào),并不能獲取到這兩個(gè)屬性。所以貌似不用太擔(dān)心,但小心為上,還是使用了Object.create(null),使對(duì)象盡可能的純粹。
function arrayUnique(target) { var result = [target[0]]; var temp = Object.create(null); temp[target[0]] = Object.create(null); temp[target[0]][(typeof target[0])] = 1; for (var i = 1, targetLen = target.length; i < targetLen; i++) { console.log(temp[target[i]], typeof target[i], temp[target[i]][typeof target[i]]); if(temp[target[i]] && temp[target[i]][typeof target[i]] === 1) { continue; } result.push(target[i]); if(typeof temp[target[i]] === "undefined") { temp[target[i]] = Object.create(null); temp[target[i]][typeof target[i]] = 1; } else { temp[target[i]][typeof target[i]] = 1; } } return result; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/110194.html
摘要:數(shù)組去重,一般會(huì)在面試的時(shí)候才會(huì)碰到,要求手寫數(shù)組去重方法的代碼。在實(shí)際項(xiàng)目中碰到的數(shù)組去重,一般都是后臺(tái)去處理,很少讓前端處理數(shù)組去重。數(shù)組去重的方法一利用去重中最常用如果不考慮兼容性,這種去重的方法代碼最少。 數(shù)組去重,一般會(huì)在面試的時(shí)候才會(huì)碰到,要求手寫數(shù)組去重方法的代碼。如果是被提問(wèn)到,數(shù)組去重的方法有哪些?你能答出其中的10種,面試官很有可能對(duì)你刮目相看。 在實(shí)際項(xiàng)目中碰到的...
摘要:引子數(shù)組去重是一個(gè)老生常談的話題,在面試中也經(jīng)常會(huì)被問(wèn)道。其中如果數(shù)組是排序的,去重運(yùn)算效率更高,因?yàn)榕判蚰軌驅(qū)⑾嗤臄?shù)排列在一起,方便前后比較。當(dāng)數(shù)組有序?qū)τ趯?duì)象的去重,我們知道為,所以使用比較對(duì)象在實(shí)際場(chǎng)景中沒(méi)有意義。 引子 數(shù)組去重是一個(gè)老生常談的話題,在面試中也經(jīng)常會(huì)被問(wèn)道。對(duì)于去重,有兩種主流思想: 先排序,線性遍歷后去重,時(shí)間復(fù)雜度O(n*log2n); 使用哈希,空間換...
摘要:專題系列第三篇,講解各種數(shù)組去重方法,并且跟著寫一個(gè)前言數(shù)組去重方法老生常談,既然是常談,我也來(lái)談?wù)?。它類似于?shù)組,但是成員的值都是唯一的,沒(méi)有重復(fù)的值。 JavaScript 專題系列第三篇,講解各種數(shù)組去重方法,并且跟著 underscore 寫一個(gè) unique API 前言 數(shù)組去重方法老生常談,既然是常談,我也來(lái)談?wù)劇?雙層循環(huán) 也許我們首先想到的是使用 indexOf 來(lái)循...
摘要:數(shù)組去重,一般都是在面試的時(shí)候才會(huì)碰到,一般是要求手寫數(shù)組去重方法的代碼。如果是被提問(wèn)到,數(shù)組去重的方法有哪些你能答出其中的種,面試官很有可能對(duì)你刮目相看。數(shù)組去重的方法一利用去重中最常用不考慮兼容性,這種去重的方法代碼最少。 數(shù)組去重,一般都是在面試的時(shí)候才會(huì)碰到,一般是要求手寫數(shù)組去重方法的代碼。如果是被提問(wèn)到,數(shù)組去重的方法有哪些?你能答出其中的10種,面試官很有可能對(duì)你刮目相看...
摘要:工作過(guò)程中經(jīng)常會(huì)用到數(shù)組去重,用到的時(shí)候往往一時(shí)想不到好方法,所以這里來(lái)總結(jié)一下去重方法。和方法分別為添加成員方法和得到鍵值方法。因此,利用方法也可以實(shí)現(xiàn)數(shù)組的去重。 工作過(guò)程中經(jīng)常會(huì)用到數(shù)組去重,用到的時(shí)候往往一時(shí)想不到好方法,所以這里來(lái)總結(jié)一下去重方法。使用es6去重代碼很簡(jiǎn)單,而且ES6已經(jīng)相當(dāng)普及了。所以先來(lái)介紹一下es6中的方法。 1.ES6中Map結(jié)構(gòu)方法 function...
閱讀 2094·2021-11-23 10:13
閱讀 2802·2021-11-09 09:47
閱讀 2747·2021-09-22 15:08
閱讀 3330·2021-09-03 10:46
閱讀 2240·2019-08-30 15:54
閱讀 923·2019-08-28 18:09
閱讀 2435·2019-08-26 18:26
閱讀 2346·2019-08-26 13:48