2015-06-20 69 views
0

我試圖用減少方法如下但消除重複,這是不太工作:使用減少的方法來消除任何重複的數字

var unique = function(array) { 
array = array.sort(function(a,b) {return a-b;}); 
var noDup = [array[0]]; 
array.reduce(function(c,d) { 
    if(c!==d) { 
     noDup.push(d); 
     return d; 
    } 
}); 
return noDup; 
}; 
var x = [9,2,1,5,9,1,1,4,2,9];//==>[1, 1, 2, 4, 5, 9, 9] 
+0

爲什麼'返回d;'? – Bergi

回答

2

你是使用reduce的「中間值」來保存先前的值,因此您可以在下次通過時檢查它。但是,這使得你無法計算出你想要的真正的中間值,這是你正在構建的獨特陣列,所以你不得不在外面宣佈它(noDup),這種失敗是完全的目的。然後你的代碼有問題,如不提供初始值reduce。在這種情況下,reduce有一個特殊的行爲,就是用數組的前兩個值調用回調函數;你沒有正確處理的情況。

無論如何,因爲它似乎你願意數組排序,你能避免做一個indexOf每一次循環,通過只記住前值和檢查反對:

function unique(values) { 
    var prev; 
    return values . sort() . reduce(function(result, cur) { 
     if (cur !== prev) result.push(cur); 
     prev = cur; 
     return result; 
    }, []); 
} 

但事實證明實際上我們不需要保留prev的值;相反,我們可以簡單地直接引用前一個元素,因爲filter通過指數和數組的附加參數回調,所以:

function unique(values) { 
    return values . sort() . reduce(function(result, cur, index, array) { 
     if (cur !== array[index-1]) result.push(cur); 
     return result; 
    }, []); 
} 

但是,如果你仔細想想,這只不過是用書面的過濾器更減少。它只是篩選出與前一個相同的數字。所以只是把它寫作爲過濾器開始:

function unique(values) { 
    return values . sort() . filter(value, i, arr) { return value !== arr[i-1]; }); 
} 

還有其他的方法來去除使用過濾器不需要排序重複。這裏有一個簡單的例子:

values . filter(function(value, i, arr) { return arr.indexOf(value) === i; }); 

這是說,過濾出一個數字,如果它在數組中第一次找到的位置是它的位置。換句話說,過濾出數組中較早出現的數字。

+0

我剛剛對第一種方法有疑問。你用'if(cur!== prev)result.push(cur);'但prev甚至沒有宣佈。這是如何工作的當我這樣做時,我通常會得到錯誤我知道這是一箇舊帖子,但只是想知道 – daddycardona

3
function unique(values) { 
    return values.reduce(function(prev, cur) { 
     if (prev.indexOf(cur) == -1) { 
      prev.push(cur); 
     } 

     return prev; 
    }, []); 
} 

unique([9,2,1,5,9,1,1,4,2,9]) // --> [9, 2, 1, 5, 4] 

fiddle