2013-08-02 17 views
15

Ich bin auf der Suche nach einer einfachen Möglichkeit, einen doppelten Wert aus einem Array zu entfernen. Ich habe herausgefunden, wie man erkennt, ob es ein Duplikat gibt oder nicht, nur weiß ich nicht, wie ich es aus dem Wert "schieben" soll. Wenn Sie beispielsweise zum angegebenen Link gehen und dann "abca" eingeben: (nach jedem Buchstaben die Eingabetaste drücken) .. es wird "duplicate!"Entfernen Sie doppelte Artikel aus dem Array Javascript

Aber ich möchte auch herausfinden, wie Sie dieses Duplikat aus dem Textfeld entfernen?

http://jsfiddle.net/P3gpp/

Dies ist der Teil, der ::

nicht zu funktionieren scheint
sort = sort.push(i); 
textVal = sort; 
return textVal; 

Antwort

49

Warum es auf die harte Art und Weise tun, kann es leichter Javascript Filterfunktion, die für diese Art von Operationen spezifisch ist mit erfolgen:

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

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


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

Ich denke, dass im Jahr 2014, fünf Jahre in der EcmaScript 5 Ära und mit IE8 unter 10% der Welt-Browser-Anteil, können wir dies sicher die richtige Antwort nennen. Wenn es um die Unterstützung älterer Versionen von IE geht, kann eine Polyfill-Bibliothek für EC5 verwendet werden. – Semicolon

+1

(Obwohl "Filter" in 90% der Fälle die richtige Antwort ist, ist es in Situationen, in denen es möglicherweise an anderer Stelle Verweise auf das ursprüngliche Array gibt, nicht geeignet, da es ein neues Array und das Original erstellt Array-Objekt bleibt intakt.) – Semicolon

4

Dies sind die Funktionen, die ich erstellt/Verwendung zum Entfernen von Duplikaten:

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

So ist die Verwendung von Erste, so könnte Ihr Code aussehen:

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

Vielen Dank. Das funktioniert sehr gut! – Matthew

1

Sie können dies mit nur einem Objekt leicht tun:

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

Betrachte: 'Ergebnis + = char in gesehen? '': gesehen [char] = char; ' – RobG

2

Sie Array.reduce() verwenden können, die Duplikate zu entfernen. Sie benötigen ein Hilfsobjekt, um zu verfolgen, wie oft ein Objekt gesehen wurde.

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

Der Ausgang des reduce() Schritt kann direkt wieder den Textbereich zu füllen verwendet werden, ohne dass die ursprüngliche Sortierreihenfolge zu beeinflussen.

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

Basierend auf user2668376 Lösung, Dies wird ein neues Array ohne Duplikate zurückgeben.

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

Danach können Sie tun:

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

Ergebnis sein wird; [1, 3, 7].

+0

Also, wenn user2668376 bereits mit dieser Lösung geantwortet hat, warum wiederholen Sie es? Übrigens, du hast ein "Selbst" zu viel. – Bergi

+1

Seine Lösung ist ohne .prototype. Meiner Meinung nach ist es viel besser, das zu benutzen. Ich habe die var self = this gelöscht; –

Verwandte Themen