2016-07-14 16 views
3

Wir haben es geschafft, das folgende Skript zu erstellen, um doppelte Strings aus einem Array zu entfernen. Es ist jedoch wichtig, dass wir die Reihenfolge des Arrays beibehalten, wenn wir sie bei einem ng-repeat durchschlingen. Darüber hinaus möchten wir, dass die übrigen Elemente den gleichen Index beibehalten.Der beste Weg, doppelte Strings in einem Array zu entfernen

Dieser Code oben funktioniert, aber wir glauben, dass es eine einfachere Lösung für unser Problem als diese geben muss. Hat jemand anderes ein ähnliches Problem und eine bessere Lösung?

+0

wie über die Verwendung von für den gleichen Zweck reduzieren? Hier ist die Geige mit Zahlen statt Strings, aber ich denke nicht, dass es wichtig sein sollte https://jsfiddle.net/58z7nrfy/ – llamerr

+0

Sie suchen nach Array von Strings oder Array von irgendwelchen? Können Sie einige Anwendungsfälle oder ein Beispiel dafür hinzufügen, worum es bei Ihnen geht (etwas Vorher und Nachher). –

Antwort

3

Variant https://jsfiddle.net/58z7nrfy/1/ reduziert

var a = [1,2,3,1,2,3,2,2,3,4,5,5,12,1,23,4,1]; 

var b = a.reduce(function(p,c,i,a){ 
    if (p.indexOf(c) == -1) p.push(c); 
    else p.push('') 
    return p; 
}, []) 
console.log(b) 

[1, 2, 3, "", "", "", "", "", "", 4, 5, "", 12, "", 23, "", ""]

+0

Dein Weg ist etwas schneller also danke für deine Antwort. –

1

Wenn der Zielbrowser spread operator dann versuchen, in der Konsole unterstützen:

[...new Set(['3','1','1','5'])] 
// ['3','1','5'] 

Oder wenn Browser-Unterstützung Array.from Sie auch schreiben können:

mit
Array.from(new Set(['3','1','1','5'])) 
// ['3','1','5'] 
+0

Das würde also funktionieren, aber ich muss die Länge des Arrays gleich halten. –

+1

@MaxLynn Wie kann man die gleiche Länge behalten, wenn man Werte daraus entfernt? – llamerr

+0

Jungs, Sie müssen die Frage tiefer lesen. Wir müssen die Reihenfolge des Arrays beibehalten, damit wir wissen, welche keinen Text benötigen. Deshalb ersetzen wir im Duplikat das Duplikat durch eine leere Zeichenfolge –

2

Sie könnten eine Map verwenden, die Typ ist beweisen und verhindert, immer wieder mit Array#indexOf iterieren.

var a = [1, 2, 3, 1, 2, 3, 2, 2, 3, 4, 5, 5, 12, 1, 23, 4, 1, '23'], 
 
    filtered = a.filter(function (a) { 
 
     if (!this.has(a)) { 
 
      this.set(a, true); 
 
      return true; 
 
     } 
 
    }, new Map); 
 

 
console.log(filtered);

+0

Ihre Antwort behandeln gleiche Nummer und String-Nummer als verschiedene Elemente, ist das was Sie wollen? Übrigens habe ich die Anfrage von OP überhaupt nicht bekommen. –

+0

@mortezaT, vielleicht, ich weiß es auch nicht :) –

1

akzeptierte Antwort ist sehr ineffizient. Man könnte reduzieren und eine Hash-Tabelle oder ein Map-Objekt verwenden, um die Leistung zu steigern. Hier würde ich Karte anstelle von reduzieren bevorzugen. Aber ich denke, @Nina Scholz 'Ansatz wird durch Verdoppelung der Karten erweitert, die richtige Antwort auf die Frage von OP ist wie folgt;

var a = [1, 2, 3, 1, 2, 3, 2, 2, 3, 4, 5, 5, 12, 1, 23, 4, 1, '23'], 
 
unified = a.map(function(e) { 
 
        return this.has(e) ? void 0 : (this.set(e,"Cheap Thrills"),e); 
 
       }, new Map()); 
 
console.log(unified);

Wenn dies dann ein Produktionscode mit einer beliebigen Länge Array sein würde, anstatt mit functors, würde ich die Karte Methode mit Standardfunktionen implementieren, obwohl da sie eine zusätzliche ernsthafte Leistungssteigerung führt in großen Arrays. (Wie in der Größe 10K +)

0

benutzte ich dieses Skript:

var words = ['one', 'one', 'two', 'three', 'three', 'two']; 
    var result = []; 
    for(i=0;i<words.length;i++){ 
     if(result.indexOf(words[i]) == -1){ 
     result.push(words[i]) 
     } 
    } 
0

ich denke lodash uniq() sehr hilfreich

let data = [1,2,3,1,2,3,2,2,3,4,5,5,12,1,23,4,1]; 
let uniqData = _.uniq(data ,(e) => { 
return e; 
}); 

dann wird ausgegeben:

[1, 2, 3, 4, 5, 12, 23] 
Verwandte Themen