2017-08-05 80 views
2

這是我發現的代碼作爲這個問題的答案:編寫一個JavaScript程序以從數組中刪除重複項(忽略大小寫敏感)。如何在JavaScript中使用indexOf和filter()

var arr1=[3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3, 'A']; 

var uniqueArray = arr1.filter(function(elem,i,rep){ 
    return i == rep.indexOf(elem); 
}) 
console.log(uniqueArray); 

我知道什麼過濾器()不和的indexOf用來查找元素中第一次出現的索引,但我不明白怎麼這行:

i == rep.indexOf(elem); 

只介紹uniqueArray的獨特元素。

+0

'var uniqueArray = [... new Set(arr1)];' – baao

回答

0

返回值是測試我等於找到的元素的索引,所以函數返回將是true或false。

2

根據MDN的約01​​文章:

的的indexOf()方法返回在該給定的元件 可以在陣列中可以發現,或-1,如果它不存在的第一個索引。

在代碼中你已經呈現:

var uniqueArray = arr1.filter(function(elem,i,rep){ 
    return i == rep.indexOf(elem); 
}) 

在過濾器的回調變量i是數組中的當前項目的索引。如果項目的外觀不止一個,則當前索引(i)和Array#indexOf返回的索引在第一個之後的重複值不同。在這種情況下,過濾器回調將返回false,並且重複的值將被過濾掉。

2
i == rep.indexOf(elem); 

將總是返回其下元件已經在陣列中被發現的第一個索引,所以只有第一任何副本將經濾波的陣列中被接受。

+0

我喜歡你解釋行爲的方式。簡明扼要地給出一個完整的解釋。 – davidxxx

0
var uniqueArray = arr1.filter(function(elem,i,rep){ 
    return i == rep.indexOf(elem); 
}) 

這裏ELEM將包含陣列的每個元素,我將當前ELEM的索引和代表將包含整個陣列
現在rep.indexOf(ELEM);將始終給出該元素的第一次出現的索引現在Array.prototype.filter()以一種方式工作,如果返回true,則不會過濾它,但如果返回false,則會將其過濾出來,以便每個元素除了第一次出現會從你的例子濾除

0

w3schools

array.filter(功能(CurrentValue的,索引,ARR),thisValue)

.filter方法中,所述功能遍歷每個索引並使用indexOf找到你所說的:「首次出現的索引。」

在迭代期間,索引i遇到重複的元素,並且使用測試來查看此i是否等於給定數組中的當前元素的索引。

w3schools

的過濾器()方法創建填充有通過測試(作爲函數提供的)所有的數組元素的數組。

在你的例子中的測試是i == rep.indexOf(elem);

當迭代達到索引2時,元素爲a。然而,元素a的第一次出現在索引1。此時,i=2但是rep.indexOf(elem) = 1。測試返回false,因爲2==1false

false返回從新創建的數組中排除索引2處的重複元素a