數(shù)組去重的思考

第一種

思路:比較新數(shù)組中是否有原數(shù)組中的重復(fù)項(xiàng),如果有重復(fù)的就不添加到新數(shù)組

  • 循環(huán)數(shù)組,遍歷數(shù)組的每一個(gè)元素
  • 對(duì)于新數(shù)組進(jìn)行內(nèi)部循環(huán),如果發(fā)現(xiàn)數(shù)組中已經(jīng)存在了arr[i],結(jié)束循環(huán),如果新數(shù)組循環(huán)完成后,就可以添加
function unique(arr){
  var newarr = [];
  for(var i = 0; i<arr.length; i++){
    // 遍歷新數(shù)組,判定是否元素已經(jīng)存在
    for(var j=0;j<newarr.length; j++){
      if(arr[i]===newarr[j]){
        break;
      }
    }
    // 對(duì)于循環(huán)完成的元素進(jìn)行push
    if(j == newarr.length){
        newarr.push(arr[i])
    }
  }
  return newarr     
}

第二種(不考慮兼容)

思路:如果一個(gè)元素的indexOf()不等于本身的索引就是重復(fù)的

function unique(arr){
  var newarr = [];
  arr.forEach((item,idx,array)=>{
    array.indexOf(item)===idx &&  newarr.push(item);
  })
  return newarr
}
// 反過來就是說我們過濾掉indexOf() 不等于本身的索引的元素
function unique(arr){
  var newarr = arr.filter((item,idx,array)=>{
    return array.indexOf(item)===idx;
  })  
  return newarr    
}

第三種(只針對(duì)數(shù)組都是數(shù)字)

思路:利用數(shù)組的sort()方法,相同的元素會(huì)被放到相鄰的位置,然后比較前后位置就可以了。

function unique(arr){
  var newarr = arr.concat().sort().filter((item,idx,array)=>{
    // !idx是針對(duì)第一個(gè)元素,沒有比較直接返回
    return !idx || item != array[idx-1];
  })
}
var a = [1, 1, 3, 2, 1, 2, 4];
unique(a); //[1, 2, 3, 4]
var a = [1, '1', 3, 2, 1, 2, 4];
unique(a); //[1, 2, 3, 4]

這里就有問題了,由于我們用的是不完成等于!=,所以這種情況只是針對(duì)于數(shù)字之間的比較,如果輸入字符串,可能會(huì)被過濾掉。

拓展:為什么我這里不用嚴(yán)格的不等于呢?!==,這樣的話就不能排除特殊情況下的數(shù)字,這里根據(jù)需求來寫

// 如果是
    return !idx || item !== array[idx-1];
var a = [1, '1',1, 3, 2, 2, 4];
unique(a); //[1,'1',1, 2, 3, 4]

第四種 (ES6的set構(gòu)造函數(shù))

思路:通過es6的set的值唯一性,把數(shù)組去掉重復(fù)的,然后用Array.from()把迭代的對(duì)象變成數(shù)組

function unique(arr){
  return Array.from(new set(arr));
}

第五種(重復(fù)的元素會(huì)出現(xiàn)在數(shù)組的結(jié)尾,改變了數(shù)組的格局)

思路:利用for循環(huán)中,++i可以進(jìn)入下一個(gè)循環(huán),跳過已經(jīng)重復(fù)的元素

function unique(a) {
  var res = [];

  for (var i = 0, len = a.length; i < len; i++) {
    for (var j = i + 1; j < len; j++) {
      // 這一步十分巧妙
      // 如果發(fā)現(xiàn)相同元素
      // 則 i 自增進(jìn)入下一個(gè)循環(huán)比較
      if (a[i] === a[j])
        j = ++i;
    }

    res.push(a[i]);
  }

  return res;
}

var a = [1, 1, '1', '2', 1];
var ans = unique(a);
console.log(ans); // => ["1", "2", 1]

第六種(有序的返回?cái)?shù)組)

function unique(arr) {
    var res = [];
    arr.forEach(item => {
        if(!res.includes(item)) {
            res.push(item)
        }
    })
    return res
}
var a = [1, 1, '1', '2', 1];
var ans = unique(a);
console.log(ans); // => [1,"1", "2", ]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 前言 最近學(xué)習(xí)著,突然發(fā)現(xiàn)自己心中總有些惶恐,因?yàn)榘l(fā)現(xiàn)自己寫過的一些東西好像忘記了,又好像是以前就沒有弄徹底,所以...
    lane_developer閱讀 410評(píng)論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評(píng)論 18 399
  • 一、ES6簡(jiǎn)介 ? 歷時(shí)將近6年的時(shí)間來制定的新 ECMAScript 標(biāo)準(zhǔn) ECMAScript 6(亦稱 ...
    一歲一枯榮_閱讀 6,113評(píng)論 8 25
  • 如果你喜歡一個(gè)人 而你不想喜歡ta 靠近ta 如果你討厭一個(gè)人 而你不想討厭ta 靠近ta
    白芷白紙閱讀 101評(píng)論 0 1
  • 我一直挺佩服那些努力向上、把生活過成詩的人,他們的人生讓人覺著,生活是那么精彩,反觀自己的生活,不好不壞,沒有糟糕...
    子墨素鳶閱讀 1,962評(píng)論 0 3