2013-08-02 12 views
15

Poszukuję łatwego sposobu usunięcia duplikatu z tablicy. Pomyślałem, jak wykryć, czy istnieje duplikat, czy nie, po prostu nie wiem, jak "wypchnąć" go z wartości. Na przykład, jeśli przejdziesz do podanego linku, a następnie wpisz "abca" (naciśnij klawisz Enter/Enter po każdej literze) .. to ostrzeże "duplikat!"Usuń zduplikowany element z tablicy JavaScript

Ale chcę również dowiedzieć się, jak usunąć ten duplikat z textarea?

http://jsfiddle.net/P3gpp/

To jest ta część, która wydaje się nie być pracy ::

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

Odpowiedz

49

Dlaczego to w przykry sposób, można to zrobić łatwiej przy użyciu JavaScript funkcję filtra, który jest specjalnie dla tego rodzaju operacji:

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

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


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

Myślę, że w 2014 roku, pięć lat po erze EcmaScript 5 i przy IE8 poniżej 10% udziału w światowej przeglądarce, możemy bezpiecznie nazwać to poprawną odpowiedzią. Jeśli chodzi o obsługę starszych wersji IE, można użyć biblioteki polyfill dla EC5. – Semicolon

+1

(Chciałbym jednak zauważyć, że podczas gdy "filtr" jest właściwą odpowiedzią w 90% przypadków, nie jest odpowiedni sam w okolicznościach, gdy mogą istnieć odwołania do pierwotnej tablicy gdzie indziej, ponieważ tworzy nową tablicę i oryginał obiekt tablicy pozostaje nienaruszony.) – Semicolon

4

Są to funkcje I utworzone/zastosowanie do usuwania duplikatów:

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; 
}; 

Więc uzywajac pierwszy, tak może wyglądać twój kod:

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

Dziękuję. Działa to bardzo dobrze! – Matthew

1

Można to zrobić łatwo z tylko obiektu:

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

Zastanów się: 'result + = char in seen? '': seen [char] = char; ' – RobG

2

Można użyć Array.reduce() usunąć duplikaty. Potrzebny jest obiekt pomocniczy do śledzenia liczby wyświetleń przedmiotu.

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"); 
} 

Wyjście kroku reduce() może być stosowany bezpośrednio do ponownie wypełnić pole tekstowe, bez wpływu na oryginalny porządek.

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

podstawie user2668376 rozwiązania, to zwróci nową tablicę bez duplikatów.

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

Po tym można zrobić:

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

Wynik będzie; [1, 3, 7].

+0

Tak więc, jeśli użytkownik2668376 już odpowiedział tym rozwiązaniem, po co to powtarzać? Btw, masz za dużo siebie. – Bergi

+1

Jego rozwiązanie jest bez .prototypu. Moim zdaniem znacznie lepiej jest z tego skorzystać. Usunąłem var self = this; –