Javascript entfernt alle Vorkommen von doppelten Elementen und hinterlässt das einzige, das eindeutig ist
Lesezeit: 5 Minuten
Ich möchte Elemente entfernen, die mehr als einmal vorkommen, und das eindeutige Element erhalten. Das Array hat immer 3 Elemente. Nehmen wir an, ich habe ein Array [2,3,2]dann muss ich 3 bekommen, die nur im Array eindeutig ist (beide 2 entfernen, weil sie mehr als einmal vorkommen).
Ich habe es mit folgendem Code versucht, aber sicherlich funktioniert es nicht wie erwartet.
var firstArrTemp = [2,3,2];
var sorted_arr = firstArrTemp.sort();
var unique_element;
for (var i = 0; i < sorted_arr.length - 1; i++) {
if (sorted_arr[i + 1] != sorted_arr[i]) {
unique_element=sorted_arr[i];
}
}
alert(unique_element);
Danke!
@Vohuman, Nein, das ist kein Duplikat, die Seite, auf die Sie verwiesen haben, ergibt 2,3 als resultierendes Array. Ich möchte nur 3 erhalten und beide 2 entfernen. Bitte lesen Sie die Frage sorgfältig durch, bevor Sie sie als Duplikat markieren
– WatsMyName
21. Oktober 2014 um 11:31 Uhr
@vohuman: Das braucht diese Frage nicht. Bei dieser Frage wird nach einem Ergebnis gefragt, das alle eindeutigen Elemente enthält.
– Zerbrus
21. Oktober 2014 um 11:31 Uhr
@Johan, das ist nicht das, was ich will, bitte lies den Beitrag noch einmal
– WatsMyName
21. Oktober 2014 um 11:34 Uhr
Was ist, wenn Array ist [1,2,3] sollte zurückkehren [1,2,3]?
– Laaposto
21. Oktober 2014 um 11:36 Uhr
Das sollte den Trick machen:
Array.prototype.getUnique = function(){
var uniques = [];
for(var i = 0, l = this.length; i < l; ++i){
if(this.lastIndexOf(this[i]) == this.indexOf(this[i])) {
uniques.push(this[i]);
}
}
return uniques;
}
// Usage:
var a = [2, 6, 7856, 24, 6, 24];
alert(JSON.stringify(a.getUnique()));
console.log(a.getUnique()); // [2, 7856]
Um zu überprüfen, ob ein bestimmtes Element im Array eindeutig ist, prüft es einfach, ob der erste Index, an dem es gefunden wird, mit dem letzten Index übereinstimmt, an dem es gefunden wird.
Das ist die genaue Antwort. Danke Kumpel!
– WatsMyName
21. Oktober 2014 um 11:41 Uhr
Dies ist für kleine Arrays in Ordnung, aber wenn Ihr Array eine große Anzahl von Elementen enthält, kann dies ziemlich langsam werden.
– Blm
26. Oktober 2015 um 8:02 Uhr
Ich hatte völlig vergessen, dass ich hier eine Antwort hatte. Wenn Sie eine schnellere Lösung kennen, antworten Sie bitte 🙂
– Zerbrus
26. Oktober 2015 um 8:06 Uhr
Eine Alternative mit der Funktion filter():
var myArray = [1,2,3,2,2,4,3,7,3].sort();
var uniqueValues = myArray.filter(function(item, i, arr) {
return (item !== arr[i-1] && item !== arr[i+1]);
});
Woher uniqueValues = [1,4,7]
Klar, das funktioniert. Ein Array zu sortieren und dann erneut zu iterieren, scheint jedoch doppelte Arbeit zu sein.
– Zerbrus
21. Oktober 2014 um 11:52 Uhr
Ich bin mir nicht sicher, ob ich den Leistungstestfall ganz richtig erstellt habe (zumindest habe ich es versucht), aber hier sind die Ergebnisse: jsperf.com/remove-uniques . Das beweist nichts, aber ich sehe kein echtes Problem (oder als doppelte Arbeit), zuerst zu sortieren und dann zu filtern.
– Samuli Hakoniemi
21. Oktober 2014 um 12:03 Uhr
Die anderen Antworten haben bisher alle O(n log n) Zeitkomplexität oder schlimmer. Dies kann in erfolgen O(n) Zeit, obwohl die Verwendung von Sets (Set.has hat O(1) Komplexität) anstelle von verschachtelten Schleifen:
// .sort has complexity O(n log n): it's not needed here, avoid it
const getOnlyUniques = (arr) => {
const foundOnce = new Set();
const foundTwice = new Set();
arr.forEach((item) => {
if (foundOnce.has(item)) {
foundTwice.add(item);
}
foundOnce.add(item);
});
return arr.filter(item => !foundTwice.has(item));
};
console.log(getOnlyUniques([2, 3, 2]));
Wenn es darum geht, Duplikate aus einem Array zu entfernen, verwende ich normalerweise einen Ansatz:
const arrWithDuplicates = [1,2,2,2,3,4,4]
const arrWithUniqueValues = [...new Set(arrWithDuplicates)]
// result will be: [1,2,3,4]
Dies funktioniert auch mit Strings und Booleans.
Eine Alternative:
var a = [2,3,2], result = [];
for(var i = 0; i < a.length; i++){
if(getAllIndexes(a, a[i]).length === 1)
result.push(a[i]);
}
console.log(result);
function getAllIndexes(arr, val) {
var indexes = [], i = -1;
while (~(i = arr.indexOf(val, i+1)))
indexes.push(i);
return indexes;
}
Ich kann nicht sagen, was hier vor sich geht oO Iterieren Sie zweimal über das Array?
– Zerbrus
21. Oktober 2014 um 11:51 Uhr
@Cerbrus Hey, ich habe nicht gesagt, dass es die leistungsstärkste Lösung ist – nur eine Alternative;) Obwohl es schwierig sein wird, < O (N ^ 2) -Komplexität zu erreichen.
– Johann
21. Oktober 2014 um 12:45 Uhr
O(n) ist möglich, aber Verwendung von Sets. (könnte auch mit Objekten gemacht werden, aber Sets sind besser geeignet)
Mit diesem Ansatz können Sie die Anzahl der Vorkommen eines Elements auswählen, das Sie zurückgeben möchten
Wenn Sie beispielsweise ein Element zurückgeben möchten, das dreimal in einem Array vorkommt, setzen Sie die “Länge” auf 3
Ich kann nicht sagen, was hier vor sich geht oO Iterieren Sie zweimal über das Array?
– Zerbrus
21. Oktober 2014 um 11:51 Uhr
@Cerbrus Hey, ich habe nicht gesagt, dass es die leistungsstärkste Lösung ist – nur eine Alternative;) Obwohl es schwierig sein wird, < O (N ^ 2) -Komplexität zu erreichen.
– Johann
21. Oktober 2014 um 12:45 Uhr
O(n) ist möglich, aber Verwendung von Sets. (könnte auch mit Objekten gemacht werden, aber Sets sind besser geeignet)
– Bestimmte Leistung
15. September 2019 um 9:16 Uhr
Nina Scholz
Ein anderer Ansatz, indem man a nimmt Map und setzen Sie den Wert auf false, wenn ein Schlüssel schon einmal gesehen wurde. Filtern Sie dann das Array, indem Sie den Wert der Karte nehmen.
var array = [2, 3, 2],
result = array.filter(
Map.prototype.get,
array.reduce((m, v) => m.set(v, !m.has(v)), new Map)
);
console.log(result); // [3]
9959200cookie-checkJavascript entfernt alle Vorkommen von doppelten Elementen und hinterlässt das einzige, das eindeutig istyes
@Vohuman, Nein, das ist kein Duplikat, die Seite, auf die Sie verwiesen haben, ergibt 2,3 als resultierendes Array. Ich möchte nur 3 erhalten und beide 2 entfernen. Bitte lesen Sie die Frage sorgfältig durch, bevor Sie sie als Duplikat markieren
– WatsMyName
21. Oktober 2014 um 11:31 Uhr
@vohuman: Das braucht diese Frage nicht. Bei dieser Frage wird nach einem Ergebnis gefragt, das alle eindeutigen Elemente enthält.
– Zerbrus
21. Oktober 2014 um 11:31 Uhr
@Johan, das ist nicht das, was ich will, bitte lies den Beitrag noch einmal
– WatsMyName
21. Oktober 2014 um 11:34 Uhr
Was ist, wenn Array ist [1,2,3] sollte zurückkehren [1,2,3]?
– Laaposto
21. Oktober 2014 um 11:36 Uhr