js之陣列去重

2021-08-18 17:55:37 字數 3091 閱讀 3159

面試常考的點之一吧(我也只被考過set的用法而已)

先上最簡單版~①利用set

[... new set(arr)]
es6 提供了新的資料結構set。它類似於陣列,但是成員的值都是唯一的,沒有重複的值。new set(array)得到的是乙個set陣列(沒有重複值),三個點為擴充套件運算子,得到用逗號分隔的引數序列,最外的中括號使得我們最終得到的還是乙個陣列。這句話也可以寫成array.from(new set(arr))。不能寫成array(new set(arr)),否則會轉化成[set(size)],因為new set(arr)得到的是乙個set,如果你還想得到陣列必須array(... new set(arr)),但這其實已經和[... new set(arr)]沒有區別了。在此我們複習下array.of(3)和array(3)的區別。

array.of(3); // [3]

array(3); // [ , , ]

如果引數是兩個及兩個以上,他們表示的東西沒有區別。

// es5 的寫法

// es6 的寫法

math.max(...[14, 3, 77])

//  等同於

math.max(14, 3, 77);

// es5 的寫法

var arr1 = [0, 1, 2];

var arr2 = [3, 4, 5];

// es6 的寫法

var arr1 = [0, 1, 2];

var arr2 = [3, 4, 5];

arr1.push(...arr2);

注意push()函式後面可以跟多個引數!

提到set不由得讓人想起他的好兄弟map,在有map之前,物件object的鍵(屬性)只能是字串,如果不是字串就會呼叫tostring()方法將其轉換成字串。為了解決這個問題,map應運而生,甚至連陣列、函式、物件都可以當map的鍵。

var map = new map();

var k1 = ['a'];

var k2 = ['a'];

map.set(k1, 111);

map.set(k2, 222);

map.get( k1 ); //111

map.get( k2 ); //222

以上這個例子也說明了儘管k1、k2值相等,但他們指向的位置不同,所以在map中也是兩個不同的鍵。

提到map不由得讓人想到object,所以接下來引出我們的第二種方法:採用物件keys方法,物件中的 key 永遠不會重複

array.prototype.unique = function();

//這個地方不能用for in因為for/in迴圈會遍歷所有可列舉的屬性

//包括自有和繼承兩種

//而且for/in中i代表的是index

//可以用for/of

//此時的i代表陣列第i個值

for(var i of this)

// this.foreach(function(element) , this);

return object.keys(obj);

}

object.keys(obj)返回物件的所有屬性組成的陣列,不包括原型方法和屬性,也不能遍歷到不可列舉的屬性。此處插入一句:for in用來遍歷物件,可以遍歷到原型上的方法和屬性,但是不能遍歷到不可列舉的屬性,當然如果不想要可以用hasownproperty判斷一下是不是自有屬性。

for (var key in object) 

}

for of更適合用於陣列,因為他不會遍歷到原型上的屬性和自己本身的索引,只會遍歷陣列內的元素。

這個地方用到了foreach(),在這裡我又踩到了乙個坑

array

.foreach

(function

(currentvalue

,index

,arr

),thisvalue

)

請看引數部分,第乙個引數是個函式,函式的三個引數分別是當前值、索引和陣列;第二個引數是函式所使用的this值,請看一下**,區分兩種的不同。

var obj = /*前面宣告了,此處作為引數傳入foreach函式*/)}};

obj.print();//此時返回三個空,因為this指的是window

var obj = ,that/*前面宣告了,此處作為引數傳入foreach函式*/)}};

obj.print();//三個xx

匿名函式的this指向的是全域性,於是出現了你不指定this就會得到空的結果(因為全域性裡找不到name屬性)。

③採用foreach方法

array.prototype.unique = function()

//includes用來判斷乙個陣列是否包含乙個指定的值

if(!n.includes(element))

});return n;

}

此處用到了includes()函式,用來判斷乙個陣列裡是否擁有某個元素。

④採用filter方法

array.prototype.unique = function()
filter()函式需要注意的是他也和foreach一樣不會改變原陣列(map,some,every亦是如此)。

⑤採用indexof方法

array.prototype.unique = function()

}return this;

}

最後這種方法記住是倒著走,就可以省去網上很多還要減1的麻煩啦

JS之陣列去重

方案一,使用物件判斷陣列是否重複,發現重複則刪除當前項,並再次遍歷當前索引.function unique1 arr 建立乙個空物件 for var i 0 iobj item item 若沒有重複,則給obj新增當前項到屬性 return arr 遍歷完成,將結果返回出去 方案二,使用物件判斷陣列...

js之陣列去重

const unique arr return arr const unique arr if j newarr.length return newarr unique 1,1 1 1,2,true,false,true,3,2,2,1 1,1 2,true,false,3 核心點 2.1 inde...

js 之 陣列去重

陣列去重,一般都是在面試的時候才會碰到,一般是要求手寫陣列去重方法的 如果是被提問到,陣列去重的方法有哪些?你能答出其中的10種,面試官很有可能對你刮目相看。在真實的專案中碰到的陣列去重,一般都是後台去處理,很少讓前端處理陣列去重。雖然日常專案用到的概率比較低,但還是需要了解一下,以防面試的時候可能...