2013-08-02 63 views
15

我正在尋找一種從數組中刪除重複值的簡單方法。我想出瞭如何檢測是否存在重複,只是我不知道如何從價值中「推」它。例如,如果你去提供的鏈接,然後鍵入,「abca」(按回車/每個字母后回車鍵) ..它會提醒「重複!」刪除陣列中的重複項目Javascript

但我也想弄清楚如何從textarea中刪除重複?

http://jsfiddle.net/P3gpp/

這是一個似乎沒有工作::部分

sort = sort.push(i); 
textVal = sort; 
return textVal; 

回答

49

爲什麼這樣做硬盤的方式,它可以更容易地使用JavaScript過濾函數,它是專門爲這種操作來完成:

var arr = ["apple", "bannana", "orange", "apple", "orange"]; 

arr = arr.filter(function(item, index, inputArray) { 
      return inputArray.indexOf(item) == index; 
    }); 


--------------------- 
Output: ["apple", "bannana", "orange"] 
+4

我認爲,2014年,EcmaScript 5時代已經進入五年,而IE8低於世界瀏覽器份額的10%,我們可以放心地稱這是正確的答案。如果有人關心支持舊版本的IE,可以使用EC5的polyfill庫。 – Semicolon

+1

(我會注意到雖然'過濾器'在90%的時間內是正確的答案,但在其他地方可能會引用原始數組的情況下它本身並不合適,因爲它會創建一個新數組,而原始數組對象保持不變。) – Semicolon

4

這是我創建的功能/使用了刪除重複:

var removeDuplicatesInPlace = function (arr) { 
    var i, j, cur, found; 
    for (i = arr.length - 1; i >= 0; i--) { 
     cur = arr[i]; 
     found = false; 
     for (j = i - 1; !found && j >= 0; j--) { 
      if (cur === arr[j]) { 
       if (i !== j) { 
        arr.splice(i, 1); 
       } 
       found = true; 
      } 
     } 
    } 
    return arr; 
}; 

var removeDuplicatesGetCopy = function (arr) { 
    var ret, len, i, j, cur, found; 
    ret = []; 
    len = arr.length; 
    for (i = 0; i < len; i++) { 
     cur = arr[i]; 
     found = false; 
     for (j = 0; !found && (j < len); j++) { 
      if (cur === arr[j]) { 
       if (i === j) { 
        ret.push(cur); 
       } 
       found = true; 
      } 
     } 
    } 
    return ret; 
}; 

因此,使用第一個,這是你的代碼看起來如何:

function cleanUp() { 
    var text = document.getElementById("fld"), 
     textVal = text.value, 
     array; 

    textVal = textVal.replace(/\r/g, " "); 
    array = textVal.split(/\n/g); 

    text.value = removeDuplicatesInPlace(array).join("\n"); 
} 

DEMO:http://jsfiddle.net/VrcN6/1/

+1

謝謝。這工作得很好! – Matthew

1

您可以輕鬆地只是一個對象做到這一點:

function removeDuplicates(text) { 
    var seen = {}; 
    var result = ''; 

    for (var i = 0; i < text.length; i++) { 
     var char = text.charAt(i); 

     if (char in seen) { 
      continue; 
     } else { 
      seen[char] = true; 
      result += char; 
     } 
    } 

    return result; 
} 

function cleanUp() { 
    var elem = document.getElementById("fld"); 

    elem.value = removeDuplicates(elem.value); 
} 
+0

請考慮:'result + = char in seen? '':可見[char] = char;' – RobG

2

您可以使用Array.reduce()刪除重複項。你需要一個輔助對象來跟蹤一個物品被看到的次數。

function cleanUp() 
{ 
    var textBox = document.getElementById("fld"), 
    array = textBox.value.split(/\r?\n/g), 
    o = {}, 
    output; 

    output = array.reduce(function(prev, current) { 
     var key = '$' + current; 

     // have we seen this value before? 
     if (o[key] === void 0) { 
      prev.push(current); 
      o[key] = true; 
     } 

     return prev; 
    }, []); 

    // write back the result 
    textBox.value = output.join("\n"); 
} 

reduce()步驟的輸出可以直接用於填充再次文本區,在不影響原有的排列順序。

Demo

0
 arr3 = [1, 2, 3, 2, 4, 5]; 

     unique = []; 

    function findUnique(val) 
    { 
    status = '0'; 
    unique.forEach(function(itm){ 

     if(itm==val) 
     { 
     status=1; 
     } 

       }) 
return status; 
} 

arr3.forEach(function(itm){ 

    rtn = findUnique(itm); 
    if(rtn==0) 
    unique.push(itm); 


    }); 

    console.log(unique); // [1, 2, 3, 4, 5] 
4

基於user2668376解決方案,這將返回一個沒有重複的新數組。

Array.prototype.removeDuplicates = function() { 
    return this.filter(function (item, index, self) { 
     return self.indexOf(item) == index; 
    }); 
}; 

之後,你可以這樣做:

[1, 3, 3, 7].removeDuplicates(); 

結果會; [1, 3, 7]

+0

那麼,如果用戶2668376已經回答了這個解決方案,爲什麼要重複呢?順便說一句,你有太多的「自我」。 – Bergi

+1

他的解決方案沒有.prototype。在我看來,使用它會好得多。我刪除了var self = this; –