2017-10-05 54 views
0

我試圖很好地說我的問題,因爲它看起來像jQuery function to get all unique elements from an array?和一堆其他線程的副本。我需要非常清楚,我想從數組中獲取所有不重複的元素。也就是說,給定一個數組[1,2,3,4,5,1,2,3,5],它應該返回[4]。在另一篇文章中,我失去了理智,因爲我不明白他們爲什麼使用唯一這個詞,這意味着「成爲唯一的一類;與其他任何東西不同」。並建立返回已經重複數次的函數的函數,而只是在問這個問題時,我才明白他們是如何解釋這個問題的。環顧網絡,似乎每個人都在解釋它。從數組中獲取項目已經是獨一無二的

我覺得很親切與此驗證碼:

var myArr = [1,2,3,4,5,1,2,3,5]; 
 
    var unique = myArr.filter(function(value, index, self){ 
 
    return self.indexOf(value) != index; 
 
    }); 
 
console.log(unique);

它返回除了那些沒有得到重複的陣列中的每個值的數組。如果我可以將刪除的元素分配給唯一的,我會設置,但即使閱讀過濾器上的文檔,我也很難理解它是如何工作的。

我喜歡香草js,因爲我在FreeCodeCamp的環境中編碼,我不知道我是否可以包含庫。

+3

'返回self.indexOf(值)=== self.lastIndexOf(值);' –

+0

我想使用的「唯一的」在那些其它問題,是指所期望的輸出* *陣列僅包含唯一值,很像SQL中的「select distinct」特性。但是,是的,我明白你爲什麼會感到困惑。 – nnnnnn

+0

就「語言」而言...我會說「獲得獨特的元素」,以滿足您的需求,併爲其他人所做的工作「獲得獨特的元素」:p –

回答

2

關閉...之類的...只是檢查的indexOf相同lastIndexOf

var myArr = [1,2,3,4,5,1,2,3,5]; 
 
    var unique = myArr.filter(function(value, index, self){ 
 
    return self.indexOf(value) === self.lastIndexOf(value); 
 
    }); 
 
console.log(unique);

+0

我知道解決方案會很簡單。如果一個值的第一個索引也是最後一個,那麼它是唯一的。我很尷尬,我沒有想到它。謝謝。 –

0

你確實是非常密切的,和@ Jaromanda-X提供給您的解決方案在他的評論中,return self.indexOf(value) === self.lastIndexOf(value);。你會使用第一行:

var myArr = [1,2,3,4,5,1,2,3,5]; 
    var unique = myArr.filter(function(value, index, self){ 
    return self.indexOf(value) === self.lastIndexOf(value); 
    }); 
console.log(unique); 

僅供參考,.indexOf返回數組中值的第一指標,.lastIndexOf返回數組中值的最後一個索引。

0

利用indexOf的解決方案將需要對每個元素進行線性搜索,因此將具有O(N^2)的性能複雜度。

以下是兩步解決方案。它存儲一個數字列表和它們的計數,然後從這個列表中找出數目爲1的元素。

let myArr = [1,2,3,4,5,1,2,3,5]; 
let counts = myArr.reduce((ht, v) => { ht[v] = (ht[v] || 0) + 1; return ht;} {}); 
let unique = Object.keys(counts).filter(k => counts[k] === 1).map(v => parseInt(v, 10)); 

此解決方案假定在myArr每一個項目是一個數字。如果數組是數字和字符串的混合,以及你希望保留的類型,可以將其修改至該溶液(感謝@JaromandaX):

let myArr = [1,2,3,4,5,'apple',1,2,3,5]; 
let counts = myArr.reduce((ht, v) => { 
    ht[v] = ht[v] || {v, count:0}; 
    ht[v].count +=1; 
    return ht; 
}, {}); 
let unique = Object.keys(counts) 
        .filter(k => counts[k].count === 1) 
        .map(k => counts[k].v); 

但對於像[1, 1, 2, "2"]一個數組?上述解決方案從對象的字符串表示中派生出其鍵,因此2和字符串"2"將被視爲等效。

解決方案是使用類型和值的組合來生成密鑰。

let myArr = [1,2,3,4,5,'apple',1,"2",3,5]; 
let counts = myArr.reduce((ht, v) => { 
    let k = `${typeof(v)};${v}`; 
    ht[k] = ht[k] || {v, count:0}; 
    ht[k].count +=1; 
    return ht; 
}, {}); 
let unique = Object.keys(counts) 
        .filter(k => counts[k].count === 1) 
        .map(k => counts[k].v); 
+1

'.map(parseInt)''不會做你所需要的,因爲'.map()'用* 3 *參數調用提供的回調函數... – nnnnnn

+0

@nnnnn好點! 'map'會作爲第二個參數傳入索引,'parseInt'會將其解釋爲基數。這將是一個可怕的錯誤來嘗試和檢測。我現在要修復它。 –

+0

我認爲'.map(Number)'會很好。儘管無論哪種方式都注意到,該解決方案僅適用於數組數組。如果數組可能包含混合數據類型,則會出現問題。 – nnnnnn

相關問題