2017-08-26 120 views
0

的數組,我已經找到了解決辦法這裏由OhJeez:How to get an array of unique values from an array containing duplicates in JavaScript?JS返回由獨特的陣列

array.filter(function() { 
    var seen = {}; 
    return function(element, index, array) { 
    return !(element in seen) && (seen[element] = 1); 
    }; 
}()); 

我想問的是如何使代碼的意義之上。我不明白的部分是,var如何保持它的關鍵。每次迭代都不會重置爲空的散列/對象嗎?

編輯:我想我理解閉包是如何工作的,這並不能解決我的問題。就我的理解,Array.prototype.filter將數組的每個元素都循環到回調函數中,在這種情況下,匿名函數'var seen = {};返回函數(元素,索引,數組){return!(元素見)& &(看過[元素] = 1);} ;.這反過來又返回裏面的功能。

我的問題再一次是不應該每個迭代運行'var seen = {}'這一行?那麼如何看待它的元素呢?

+2

可能重複[JavaScript關閉如何工作?](https://stackoverflow.com/questions/111102/how-do-javascript-closures-work) – Andreas

+0

[什麼是(函數(){})( )構造在JavaScript?](https://stackoverflow.com/questions/8228281/what-is-the-function-construct-in-javascript) – Andreas

回答

0
array.filter(function() { 
    var seen = {}; 
    return function(element, index, array) { 
    return !(element in seen) && (seen[element] = 1); 
    }; 
}()); 

你可以認爲這是

var seen = {} 
array.filter(function(element, index, array) { 
    return !(element in seen) && (seen[element] = 1); 
    }) 

雙方將有相同的輸出只看到區別變種仍然在第一種情況下局部範圍,這是很好。當你調用array.filter()時,第一個參數是一個自調用的函數,它在傳遞給array.filter()之前被求值。

所以它保持seen在其關閉。

+0

@DionChan如果有用,請接受此答案。 謝謝 –

0

這段代碼是不必要的複雜,甚至會讓經驗豐富的JS程序員停下腳步一分鐘,因爲他們試圖弄清楚它在做什麼。它改寫爲

function filter() { 
    var seen = {}; 

    return array.filter(function(element, index, array) { 
    return !(element in seen) && (seen[element] = 1); 
    }); 
} 

的一點是,我們需要一個哈希(稱爲seen這裏),並必須從某個地方申報。通常情況下,我們只是在適當的周圍範圍內聲明它。無論出於什麼原因,程序員都想避免這樣做,所以他/他在傳遞給filter的函數中引入了另一個範圍。正如我所說,這是令人困惑和不必要的。

+0

假設你的代碼意味着函數過濾器(數組){...};我當然同意你的意思。但我仍然想知道爲什麼原始代碼可以工作 –

0

在這裏我們可以用兩件事來解釋這一點。

  1. JS是語言與功能可變範圍,所以needed是可見的匿名函數內它被定義。
  2. 您可以看到作爲參數array.filter的匿名自動執行功能正好用於管理變量範圍並防止每次迭代都重置needed。該函數立即被調用,並且返回array.filter的實際回調,但在該回調的作用域中持續存在needed

匿名自執行函數是JS中的一個巨大工具。例如,您可以通過article瞭解更多信息。