JS數(shù)組去重

一、利用ES6 Set去重(ES6中最常用)

functionunique(arr){

returnArray.from(newSet(arr))

}

不考慮兼容性,這種去重的方法代碼最少

二、利用for嵌套for,然后splice去重(ES5中最常用)

functionunique(arr){

for(vari=0; i<arr.length; i++){

for(varj=i+1; j<arr.length; j++){

if(arr[i]==arr[j]){ //第一個(gè)等同于第二個(gè),splice方法刪除第二個(gè)

arr.splice(j,1);

j--;

}

}

}

returnarr;

}

雙層循環(huán),外層循環(huán)元素,內(nèi)層循環(huán)時(shí)比較值。值相同時(shí),則刪去這個(gè)值。

想快速學(xué)習(xí)更多常用的ES6語(yǔ)法,可以看我之前的文章《學(xué)習(xí)ES6筆記──工作中常用到的ES6語(yǔ)法》。

三、利用indexOf去重

function unique(arr) {

if(!Array.isArray(arr)) {

console.log('type error!')

return

}

vararray= [];

for (var i = 0; i < arr.length; i++) {

if(array .indexOf(arr[i]) === -1) {

array.push(arr[i])

}

}

returnarray;

}

新建一個(gè)空的結(jié)果數(shù)組,for 循環(huán)原數(shù)組,判斷結(jié)果數(shù)組是否存在當(dāng)前元素,如果有相同的值則跳過(guò),不相同則push進(jìn)數(shù)組。

四、利用sort()

functionunique(arr){

if(!Array.isArray(arr)) {

console.log('type error!')

return;

}

arr = arr.sort()

vararrry= [arr[0]];

for(vari =1; i < arr.length; i++) {

if(arr[i] !== arr[i-1]) {

arrry.push(arr[i]);

}

}

returnarrry;

}

利用sort()排序方法,然后根據(jù)排序后的結(jié)果進(jìn)行遍歷及相鄰元素比對(duì)。

五、利用對(duì)象的屬性不能相同的特點(diǎn)進(jìn)行去重

functionunique(arr){

if(!Array.isArray(arr)) {

console.log('type error!')

return

}

vararrry= [];

varobj = {};

for(vari =0; i < arr.length; i++) {

if(!obj[arr[i]]) {

arrry.push(arr[i])

obj[arr[i]] =1

}else{

obj[arr[i]]++

}

}

returnarrry;

}

六、利用includes

functionunique(arr){

if(!Array.isArray(arr)) {

console.log('type error!')

return

}

vararrry=[];

for(vari =0; i < arr.length; i++) {

if( !arrry.includes( arr[i]) ) {//includes 檢測(cè)數(shù)組是否有某個(gè)值

arrry.push(arr[i]);

}

}

}

七、利用hasOwnProperty

functionunique(arr){

varobj = {};

returnarr.filter(function(item, index, arr){

returnobj.hasOwnProperty(typeofitem + item) ?false: (obj[typeofitem + item] =true)

})

}

利用hasOwnProperty 判斷是否存在對(duì)象屬性

八、利用filter

functionunique(arr){

returnarr.filter(function(item, index, arr){

//當(dāng)前元素,在原始數(shù)組中的第一個(gè)索引==當(dāng)前索引值,否則返回當(dāng)前元素

returnarr.indexOf(item,0) === index;

});

}

九、利用遞歸去重

functionunique(arr){

vararrry= arr;

varlen = arrry.length;

arrry.sort(function(a,b){//排序后更加方便去重

returna - b;

})

functionloop(index){

if(index >=1){

if(arrry[index] === arrry[index-1]){

arrry.splice(index,1);

}

loop(index -1);//遞歸loop,然后數(shù)組去重

}

}

loop(len-1);

returnarrry;

}

十、利用Map數(shù)據(jù)結(jié)構(gòu)去重

function arrayNonRepeatfy(arr) {

let map =newMap();

letarray=newArray(); // 數(shù)組用于返回結(jié)果

for (let i = 0; i < arr.length; i++) {

if(map .has(arr[i])) { // 如果有該key值

map .set(arr[i], true);

} else {

map .set(arr[i], false); // 如果沒(méi)有該key值

array.push(arr[i]);

}

}

returnarray ;

}

創(chuàng)建一個(gè)空Map數(shù)據(jù)結(jié)構(gòu),遍歷需要去重的數(shù)組,把數(shù)組的每一個(gè)元素作為key存到Map中。由于Map中不會(huì)出現(xiàn)相同的key值,所以最終得到的就是去重后的結(jié)果。

十一、利用reduce

Array.prototype.unique = function() {

var sortArr = this.sort();

vararray= [];

sortArr.reduce((s1,s2) => {

if(s1 !== s2){

array.push(s1);

}

returns2;

})

array.push(sortArr[sortArr.length - 1]);

returnarray ;

}

十二、[...new Set(arr)]

[...newSet(arr)]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 2019.08.02補(bǔ):對(duì)象數(shù)組建議直接循環(huán)然后使用工具庫(kù)(lodash)的深比較,評(píng)論里也有指出,文章的方法有些...
    始悔不悟閱讀 61,309評(píng)論 13 26
  • 對(duì)于數(shù)組去重我們有n種方法可以實(shí)現(xiàn)。 es5實(shí)現(xiàn)方法for循環(huán)+indexOf function unique(...
    tiancai啊呆閱讀 762評(píng)論 0 14
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,132評(píng)論 0 2
  • 進(jìn)程:進(jìn)程指正在運(yùn)行的程序。確切的來(lái)說(shuō),當(dāng)一個(gè)程序進(jìn)入內(nèi)存運(yùn)行,即變成一個(gè)進(jìn)程,進(jìn)程是處于運(yùn)行過(guò)程中的程序,并且具...
    安安靜靜寫(xiě)代碼閱讀 367評(píng)論 0 1
  • 碗 130;平碟子:80;凹碟80;鐵盤(pán)子8個(gè);湯桶子2個(gè);蒸籠3扇子(席口30個(gè)肘子)
    雪松_d0e3閱讀 127評(píng)論 0 0

友情鏈接更多精彩內(nèi)容