2016-08-01 7 views
0

Ich möchte nur Zahlen größer als 10 in einem Array filtern und die ursprüngliche Variable ändern, ohne einen Nebeneffekt zu verursachen.Filtern und Ändern von Wert der Variablen ohne eine Nebenwirkung zu verursachen

, was ich tue:

let numbers = [15, 5, 2, 1, 59, 29]; 
numbers = numbers.filter((number) => { 
    if (number > 10) return number; 
}); 

funktioniert, aber dies eine Nebenwirkung verursacht, nicht wahr? Ist es möglich, dies ohne Nebeneffekt zu tun und immer noch den gleichen Namen zu verwenden?

Danke.

+0

Bitte erklären Sie, welche Nebenwirkung Sie sprechen. –

+0

Sie können eine Variable nicht ohne Nebenwirkungen ändern, da eine Änderung Mutation erfordert. – Bergi

+0

Alles, was Sie tun wollen, ist nicht den ursprünglichen * Wert * (das Array) mutieren, und Ihr Code tut das schon. Sie können mit Ihren Variablen tun, was Sie wollen, solange Sie sie lokal halten. – Bergi

Antwort

1

Also ... was Sie tun, ist das ursprüngliche Array numbers durch ein neues Array mit den gefilterten Informationen zu ersetzen. Wenn Sie das ursprüngliche Array mutieren möchten, wird viel mehr Code benötigt. Der Grund dafür, dass Sie viel mehr Code benötigen, ist, dass Sie die Länge eines Arrays ändern, während Sie darüber hinwegschleifen, was eine schlechte Übung ist.

Um es zu tun, könnten Sie das Array einmal durchlaufen und alle Indizes finden, die einen Wert höher als 10 haben. Sobald Sie alle Indizes haben, können Sie sie überschleifen und diese Abschnitte ausschneiden Array.

Der folgende Code ist, wie Sie es tun könnten. Ich bin mir nicht sicher über am effizientesten, aber es ist ein Weg.

let numbers = [15, 5, 2, 1, 59, 29]; 
let badIndices = []; 
numbers.forEach((val, idx) => { 
    if(val > 10) badIndices.push(idx); 
}); 
badIndices = badIndices.reverse(); 
badIndices.forEach(i => numbers.splice(i, 1)); 

Sie die Reihenfolge des Indizes vor dem Spleißen, da sonst die Offset für die nachfolgenden Indizes aus sein werden umkehren wollen. Mit anderen Worten, Sie möchten das Spleißen vom Ende nach vorne beginnen. Andernfalls werden durch das Entfernen von vorne die nachfolgenden Indizes geändert, wodurch die Funktion ungültig wird.