面試常考的點之一吧(我也只被考過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請看引數部分,第乙個引數是個函式,函式的三個引數分別是當前值、索引和陣列;第二個引數是函式所使用的this值,請看一下**,區分兩種的不同。.foreach
(function
(currentvalue
,index
,arr
),thisvalue
)
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種,面試官很有可能對你刮目相看。在真實的專案中碰到的陣列去重,一般都是後台去處理,很少讓前端處理陣列去重。雖然日常專案用到的概率比較低,但還是需要了解一下,以防面試的時候可能...