Ho un array di oggetti simili alle seguenti:Rimozione oggetti equivalenti ma unici da un array JavaScript
var routeArr = [
{start: 1, end: 2},
{start: 1, end: 3},
{start: 1, end: 4},
{start: 2, end: 1},
{start: 3, end: 1},
{start: 4, end: 1}
];
Questi oggetti rappresentano il punto di inizio e fine delle righe e, come tale, {start: 1, end: 2}
e {start: 2, end: 1}
rappresentano la stessa linea.
Sto cercando di rimuovere tutte le linee duplicate dalla matrice e non riesce a trovare un modo efficace o elegante per farlo. Ho provato un ciclo annidato ma, mi è stato detto che è una cattiva pratica (e sto ricevendo errori con la mia implementazione, ed è solo brutto).
for(var i = 0, numRoutes = routeArr.length; i < numRoutes; i++) {
var primaryRoute = routeArr[i];
for(var j = 0; j < numRoutes; j++) {
var secondRoute = routeArr[j];
if(primaryRoute.start === secondRoute.end && primaryRoute.end === secondRoute.start) {
routeArr.splice(j, 1);
continue;
}
}
}
Qualcuno può offrire suggerimenti?
Il modo normale per farlo è: ordinarlo prima (nel tuo caso, dovresti invertire l'inizio e la fine se (fine> inizio)). Quindi le linee duplicate saranno esattamente uguali l'una con l'altra. Quindi basta fare un ciclo per rimuovere quello duplicato – Kelvin
Quando rimuovi un elemento dell'array, non esegui mai il ciclo da 0 a lunghezza. non è sicuro perché dopo la rimozione devi aggiustare i tuoi indici. Meglio eseguire il ciclo in ordine decrescente, vale a dire dalla lunghezza da 1 a 0, questo funzionerà nel caso in cui si rimuoverà un elemento della matrice e non si otterranno mai elementi con indici più grandi.Anche la tua istruzione if controlla solo una condizione di essere una linea identica, devi aggiungere anche altri check o statement. – simon