国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

數組去重

RyanHoo / 2428人閱讀

摘要:很容易給出的方案是當給定數組變成時,發現結果依然還是,而實際上我們期待的結果應該是。為了解決這個問題,遍歷數組元素,與已保存的元素對比的時候還應該考慮元素的類型,如下這樣就得到了我們想要的結果。

很容易給出的方案是:

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]

當給定數組變成[1, 2, 3, 4, "1"]時,發現結果依然還是 [1, 2, 3, 4],而實際上我們期待的結果應該是[1, 2, 3, 4, "1"]。
原因很簡單,Object 會將屬性的 key 值都轉成 String 類型,比如,

var a = {1: 3, "3": 9}

Object.getOwnPropertyNames(a) // ["1", "3"]

上述例子中,兩個 key 值都被轉換成了字符串,再看一下下面一個例子:

var a = {
    1: 3,
    "3": 9
}
Object.prototype.toString = function() {
    return 3;
}

console.log(a[{k: 1}]); // 9

當 key 值是一個object 的時候, 會先調用 toString 將該 object 轉成 字符串,再查找。
為了解決這個問題,遍歷數組元素,與已保存的元素對比的時候還應該考慮元素的類型,如下:

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"]

這樣就得到了我們想要的結果。有人會考慮temp對象自帶了一個__proto__和length屬性,可能在比較中會對結果造成影響。但在測試中,這兩個屬性只能通過點方法獲取,比如temp.__proto__, temp.length,而我們實際比較中使用的是方括號,并不能獲取到這兩個屬性。所以貌似不用太擔心,但小心為上,還是使用了Object.create(null),使對象盡可能的純粹。

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;
}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/110194.html

相關文章

  • JS數組去重總結

    摘要:數組去重,一般會在面試的時候才會碰到,要求手寫數組去重方法的代碼。在實際項目中碰到的數組去重,一般都是后臺去處理,很少讓前端處理數組去重。數組去重的方法一利用去重中最常用如果不考慮兼容性,這種去重的方法代碼最少。 數組去重,一般會在面試的時候才會碰到,要求手寫數組去重方法的代碼。如果是被提問到,數組去重的方法有哪些?你能答出其中的10種,面試官很有可能對你刮目相看。 在實際項目中碰到的...

    whinc 評論0 收藏0
  • 跟underscore一起學數組去重

    摘要:引子數組去重是一個老生常談的話題,在面試中也經常會被問道。其中如果數組是排序的,去重運算效率更高,因為排序能夠將相同的數排列在一起,方便前后比較。當數組有序對于對象的去重,我們知道為,所以使用比較對象在實際場景中沒有意義。 引子 數組去重是一個老生常談的話題,在面試中也經常會被問道。對于去重,有兩種主流思想: 先排序,線性遍歷后去重,時間復雜度O(n*log2n); 使用哈希,空間換...

    flybywind 評論0 收藏0
  • JavaScript專題之數組去重

    摘要:專題系列第三篇,講解各種數組去重方法,并且跟著寫一個前言數組去重方法老生常談,既然是常談,我也來談談。它類似于數組,但是成員的值都是唯一的,沒有重復的值。 JavaScript 專題系列第三篇,講解各種數組去重方法,并且跟著 underscore 寫一個 unique API 前言 數組去重方法老生常談,既然是常談,我也來談談。 雙層循環 也許我們首先想到的是使用 indexOf 來循...

    fsmStudy 評論0 收藏0
  • JavaScript數組去重(12種方法,史上最全)

    摘要:數組去重,一般都是在面試的時候才會碰到,一般是要求手寫數組去重方法的代碼。如果是被提問到,數組去重的方法有哪些你能答出其中的種,面試官很有可能對你刮目相看。數組去重的方法一利用去重中最常用不考慮兼容性,這種去重的方法代碼最少。 數組去重,一般都是在面試的時候才會碰到,一般是要求手寫數組去重方法的代碼。如果是被提問到,數組去重的方法有哪些?你能答出其中的10種,面試官很有可能對你刮目相看...

    rozbo 評論0 收藏0
  • JavaScript數組方法之數組去重方法

    摘要:工作過程中經常會用到數組去重,用到的時候往往一時想不到好方法,所以這里來總結一下去重方法。和方法分別為添加成員方法和得到鍵值方法。因此,利用方法也可以實現數組的去重。 工作過程中經常會用到數組去重,用到的時候往往一時想不到好方法,所以這里來總結一下去重方法。使用es6去重代碼很簡單,而且ES6已經相當普及了。所以先來介紹一下es6中的方法。 1.ES6中Map結構方法 function...

    CarlBenjamin 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<