Duplikate vom Array ausschließen [Duplikat]
Ich versuche, doppelte Zahlen aus dem Array auszuschließen. Zum Beispiel: Wenn ich ein Array von [1,2,2,3,5,5] filtere, sollte die Ausgabe [1,3] sein.
function unique(arr) {
let sortArr = arr.sort()
let res = []
for (let i = 0; i < arr.length; i++) {
if (sortArr[i] != sortArr[i + 1]) {
res.push(sortArr[i])
}
}
return res
}
console.log(unique([1, 2, 2, 3, 5, 5]))
Ich habe versucht, einem Array keine doppelten Zahlen hinzuzufügen, aber anstelle von [1,3] erhalte ich [1,2,3,5]
Antworten
Am einfachsten wäre es zu überprüfen, ob sowohl das nächste als auch das vorherige Element nicht dem aktuellen Element entsprechen:
function unique(arr) {
let sortArr = arr.sort()
let res = []
for (let i = 0; i < arr.length; i++) {
if (sortArr[i] != sortArr[i + 1] && sortArr[i] !== sortArr[i - 1]) {
res.push(sortArr[i])
}
}
return res
}
console.log(unique([1, 2, 2, 3, 5, 5]))
Hat .sortaber eine rechnerische Komplexität von O(n log n). Dies kann rechtzeitig erfolgen, O(n)indem stattdessen die Anzahl der Ergebnisse in einem Objekt hochgezählt wird:
function unique(arr) {
const ones = new Set();
const dupes = new Set();
for (const item of arr) {
if (dupes.has(item)) continue;
if (ones.has(item)) {
dupes.add(item);
ones.delete(item);
} else ones.add(item);
}
return [...ones];
}
console.log(unique([1, 2, 2, 3, 5, 5]))
Mit Array.reducekönnen Sie die doppelte Anzahl jedes Elements abrufen und basierend auf diesen Daten die nicht duplizierten Werte nur wie folgt abrufen.
function unique(arr) {
const groupBy = arr.reduce((acc, cur) => {
acc[cur] ? acc[cur] ++ : acc[cur] = 1;
return acc;
}, {});
return Object.entries(groupBy)
.filter(([key, value]) => value === 1)
.map(([key]) => +key);
}
console.log(unique([1, 2, 2, 3, 5, 5]));
Zählen Sie die Anzahl der Werte und geben Sie nur die Werte zurück, die gleich 1 sind
function unique(array) {
var map = new Map();
array.forEach(a => map.set(a, (map.get(a) || 0) + 1));
return array.filter(a => map.get(a) === 1);
}
console.log(unique([1, 2, 2, 3, 5, 5]));