2016-05-09 9 views
2

Ich versuche, eine Funktion zu erstellen, die Array.prototype.push nachahmt. Es braucht eine variable Anzahl von Argumenten und schiebt sie in ein bestimmtes Array. Ich habe es geschafft, dies mit dem folgenden Code zu tun:Schreibe folgenden Stück JavaScript-Code

var array=[]; 
function append(){ 
    for(var i=0;i<arguments.length;i++) 
     array.push(arguments[i]); 
} 

Nun meine Frage: Kann ich die Append Funktion ohne Verwendung von „for-Schleife“ umschreiben? Vielen Dank im Voraus.

+0

'zurück [] .slice.call (Argumente); ' – jcubic

+0

Sie können' arguments.forEach (function (arg) {...}) 'versuchen. Immer noch eine Schleife, aber meiner Meinung nach ein bisschen sauberer. –

+1

Mögliches Duplikat von [Javascript push Array-Werte in ein anderes Array] (http://stackoverflow.com/questions/4156101/javascript-push-array-values-into-another-array) – Phil

Antwort

1

könnten Sie verwenden Array.prototype.push.apply

function append(){ 
    // make arguments an array 
    var args = Array.prototype.slice.call(arguments); 
    // return the number of elements pushed in the array 
    return Array.prototype.push.apply(array, args); 
} 

Also, was mit args hier passiert? Wir verwenden Array.prototype.slice.call mit Argumenten, der Zweck ist arguments ein Array zu machen, weil es ein spezielles Objekt ist. Function.prototype.call wird verwendet, um eine Funktion mit einem bestimmten Kontext (alias this) aufzurufen, und dann die Argumente, um die Funktion mit (Komma getrennt) aufzurufen. Praktischerweise scheint es, dass slice() am length Eigenschaft des this Kontext sieht, und arguments hat auch eine, und wenn sie nicht leer ist, hat Eigenschaften von 0 bis length -1, die slicearguments in einem neuen Array kopieren können.

+0

Hey danke, dass es funktioniert hat. Würdest du mir erklären, was für ein Anruf? – cssGEEK

+0

@cssGEEK Ich habe meine Antwort aktualisiert, um diesen Teil zu erklären – axelduch

2

Wenn Sie Argumente Array zu erhalten, sollten Sie Array der Slice-Funktion auf einem arguments-Objekt verwenden und es wird es in ein Standard-JavaScript-Array konvertieren:

var array = Array.prototype.slice.call(arguments); 
+0

das wird nicht funktionieren, müssen Sie zunächst Argumente in Array konvertieren. – jcubic

+0

ja, du hast Recht, ich habe die Antwort aktualisiert. – alexmac

+1

Sie brauchen nicht concat, 'args' ist bereits Array, das Sie brauchen. – jcubic

0

du ohne for Schleife neu schreiben kann, aber Sie müssen eine Schleife von einer Art verwenden (Sie arbeiten mit mehreren Elementen, es ist eine Notwendigkeit).

Wenn Sie Zugriff auf ES6 oder Babel haben, würde ich so etwas wie verwenden:

function append(...args) { 
    return array.concat(args); 
} 

Ohne ES6, Sie rund um die Tatsache arbeiten müssen, dass arguments kein echtes Array ist. Sie können weiterhin die meisten Array-Methoden darauf anwenden, indem Sie über den Array-Prototyp darauf zugreifen. arguments in ein Array umzuwandeln ist einfach genug, dann können Sie die zwei concat:

function append() { 
    var args = Array.prototype.map.call(arguments, function (it) { 
    return it; 
    }); 
    return array.concat(args); 
} 

Beachten Sie, dass keines von beiden wird die globale array, ändern aber wird ein neues Array mit den kombinierten Werte zurückgeben, können allein verwendet oder zurück zu array zugewiesen werden. Dies ist etwas einfacher und robuster als der Versuch, mit push zu arbeiten, wenn Sie zu array = append(...) bereit sind.

0

Eigentlich glaube ich wirklich, dass Push muss für die funktionale JS neu definiert werden, da es Rückgabewert ist die Länge des resultierenden Array und es ist die meiste Zeit nutzlos. Zum Beispiel, wenn es erforderlich ist, einen Wert zu pushen und ein Array als Parameter an eine Funktion zu übergeben, kann dies nicht inline ausgeführt werden und die Dinge werden unordentlich. Stattdessen möchte ich, dass es einen Verweis auf das Array zurückgibt, an dem es aufgerufen wird, oder sogar ein neues Array, von dem ich die Längeninformation trotzdem bekommen kann. Mein neuer Push-Vorschlag wäre wie folgt;

Array.prototype.push = function(...args) { 
         return args.reduce(function(p,c) { 
               p[p.length] = c; 
               return p 
              }, this) 
         }; 

Es gibt einen perfekten Verweis auf das Array, das es aufgerufen wird.

Verwandte Themen