2017-10-10 3 views
0

ich einen benutzerdefinierten Prototyp, mit dem erstellten ein Array aufzuräumen, um entfernen und Art es dupliziert. Es funktionierte und sah wie folgt aus:Ändern eines Array an Ort und Stelle mit Prototyp

// given an example array such as this. 
var names = [ 'Lara', 'Lucy', 'Alexa', 'Vanessa', 'Lucy', 'Brianna', 'Sandra' ]; 

Array.prototype.clean_up = function(){ 
    var 
     set = [] 
    ; 
    this.forEach(function(item){ 
     if (set.indexOf(item) === -1) { 
      set.push(item); 
     } 
    }); 

    set.sort(); 

    return set; 
}; 

Mein einziges Problem ist, dass ich es so nennen haben:

names = names.clean_up(); 

Ich würde es lieber, wenn ich es nennen könnte wie folgt, wie Array.sort() (I Ich glaube, dies wird als In-Place-Implementierung bezeichnet). Wie konntest du das tun?

names.clean_up(); 

EDIT: (Offenbar das gehört hier und nicht in Antworten)

Meine aktuelle Lösung sieht wie folgt aus, aber es fühlt sich ein bisschen unwirksam. Ich frage mich, ob es besser gemacht werden könnte.

Array.prototype.clean_up = function(){ 
    var 
     set = [], 
     self = this 
    ; 
    this.forEach(function(item){ 
     if (set.indexOf(item) === -1) { 
      set.push(item); 
     } 
    }); 

    set.sort(); 

    // reset and re-fill. 
    while (this.length > 0) { 
     this.pop(); 
    } 

    set.forEach(function(item){ 
     self.push(item); 
    }); 
}; 

Unwirksame für einen, und für die anderen: es hat mentioned mehrere Male, dass Sie keine Original-Arrays ändern sollte. Warum das?

Ich meine, wenn es eine Funktion wie Array.sort() dann zeigt es, dass die Sprache, die es dazu in der Lage ist, und dass einig Implementierungen scheinen „in Ordnung“ zu sein? Warum ist sort() okay, aber eine benutzerdefinierte Funktion nicht?

Antwort

0

Wenn Sie das Array an Ort und Stelle beeinflussen möchten, sollten Sie nach Duplikaten und Spleiß sie aus dem Array suchen. Array.prototype.indexOf kann mit einem zweiten Argument verwendet werden, um vom aktuellen Element zu suchen und Duplikate zu entfernen, z.

Array.prototype.clean = function(){ 
 
    // Iterate backwards over array 
 
    this.reduceRight(function(acc, value, index, arr) { 
 
    // If first index of value isn't current index, remove this element 
 
    if (arr.indexOf(value) != index) arr.splice(index, 1); 
 
    }, null); 
 
    // Now sort 
 
    this.sort(); 
 
    // Return for chaining 
 
    return this; 
 
} 
 

 
var arr = 'aztatffgff'.split(''); 
 
console.log(arr.join()); 
 
console.log(arr.clean().join());

Iterieren nach vorn über ein Array funktioniert nicht, da, wenn Elemente gespleißt werden, werden die Elemente so gemischt unten die nächste übersprungen. Sie können auch nicht einfach ein Array mit zB Filter erstellen, da Sie dieses neue Array nicht dieses zuweisen können.

reduceRight könnte mit einem für Schleife ersetzt werden.

+0

Es ist ein bisschen schwer, den Kopf zu wickeln, und ich bin nicht intuitiv mit dem 'reduceRight', aber es macht perfekt, was ich will. Vielen Dank. Grundsätzlich ist die Verwendung von "Spleiß" der Schlüssel (im Vergleich zu meinem Code). – WoodrowShigeru

+0

@ WoodrowShigeru-wenn es ein * forEachRight * Ich würde das verwenden. ;-) – RobG

Verwandte Themen