Ich versuche, einen "universellen" Array-Füller zu schreiben, der ein Array mit einem bestimmten Objekt füllt. Ich habe eine Klasse in Javascript simuliert und möchte jetzt eine Funktion schreiben, die das Array mit Typen dieser Klasse füllt

function fillArray(theArrayToFill,amount,theObject) {
for ( var i = 0; i != amount; ++i ) 
    {theArrayToFill.push(theObject);}
}

Aber fillArray (theArray, 3, neuer Feind (0,0)); Füllt das Array mit einem Verweis auf das Objekt "Feind" und das ist nicht das, was ich will, ich möchte eine exakte Kopie, aber wenn ich Objekt 0 mutiere, ändert sich Objekt 2 möglicherweise nicht.

Bitte helfen Sie Danke

0
Bosiwow 2 Dez. 2013 im 20:41

4 Antworten

Beste Antwort

Wenn Sie Underscore verwenden, bietet es eine Klonhilfefunktion.

function fillArray(theArrayToFill,amount,theObject) {
for ( var i = 0; i != amount; ++i ) 
    {theArrayToFill.push(_.clone(theObject));}
}
0
Shreyas 2 Dez. 2013 im 17:10

Ich würde Ihnen empfehlen, Ihrem Objekt eine Klonmethode hinzuzufügen. Die Klonmethode sollte ein neues Objekt erstellen und dessen Wert durch Kopieren des aktuellen Objekts festlegen. Anschließend gibt die Methode dieses neue Objekt zurück.

Beispiel:

function clone(obj)
{
    var newObj = new YourObject();
    newObj.setName(obj.getName());
    //Do this for every properties

    return newObj;
}
1
Shryme 2 Dez. 2013 im 16:44

Sie können Object.create ()

function fillArray(theArrayToFill,amount,theObject) {
    for ( var i = 0; i != amount; ++i ) {
        theArrayToFill.push(Object.create(theObject));
    }
}

Wenn Sie einen neuen, mit einem Array gefüllten Standardwert zurückgeben möchten, können Sie den nächsten Code verwenden

function fillArray(amount,theObject) {
    return Array.apply(null,Array(amount)).map(function(_){return Object.create(theObject);});
}
0
Grundy 2 Dez. 2013 im 17:03

Da Sie den Konstruktor bereits haben, können Sie ihn folgendermaßen verwenden:

function fillArray(theArrayToFill,amount,ctor) {
  for ( var i = 0; i != amount; ++i ) {
    theArrayToFill.push(new ctor(0,0));
  }
}

// usage:
fillArray(theArray,3,Enemy);

So wie Sie ursprünglich die fillArray-Methode aufgerufen haben, haben Sie ein Objekt erstellt (unmittelbar vor dem Aufruf der Funktion) und es als Parameter an die fillArray-Methode übergeben. Die Methode verarbeitete dann das Array mit Verweisen auf dieses Objekt, sodass jedes Element im Array tatsächlich auf dasselbe Objekt verweist.

BEARBEITEN: Es fällt Ihnen keine einfache Lösung ein, wenn Sie dem Konstruktor unterschiedliche Argumente übergeben möchten. Hier ist ein Hacky, der für Ihre Zwecke ausreichen könnte:

function fillArray(theArrayToFill,amount,ctor) {
  for ( var i = 0; i != amount; ++i ) {
    theArrayToFill.push(new ctor(arguments[3], arguments[4], arguments[5],
        arguments[6], arguments[7], arguments[8], arguments[9], arguments[10], 
        arguments[11], arguments[12], arguments[13], arguments[14]));
  }
}

// usage:
fillArray(theArray,3,Enemy,0,0);
fillArray(theArray,3,Friend,1,2,3,4,5,6,7,8);

Dies funktioniert natürlich nur für Konstruktoren mit weniger als 12 Argumenten, und einige Überprüfungen, die auf verwendeten Parametern in einem Konstruktor basieren, schlagen ebenfalls fehl, aber die Aufgabe wird erledigt.

PS: Ich schlage nicht vor, dass Sie diesen Ansatz verwenden. Es sieht so aus, als wäre eine Klonmethode besser für Ihren Zweck geeignet.

0
Tibos 2 Dez. 2013 im 17:01