467 Stimmen

Wie kann ich das Objekt "arguments" in ein Array in JavaScript umwandeln?

El arguments Objekt in JavaScript ist eine seltsame Warze - es verhält sich in den meisten Situationen wie ein Array, aber es ist nicht eigentlich ein Array-Objekt. Da es sich um wirklich etwas ganz anderes verfügt es nicht über die nützlichen Funktionen von Array.prototype wie forEach , sort , filter und map .

Es ist trivial einfach, ein neues Array aus einem Argument-Objekt mit einer einfachen for-Schleife zu konstruieren. Zum Beispiel sortiert diese Funktion ihre Argumente:

function sortArgs() {
    var args = [];
    for (var i = 0; i < arguments.length; i++)
        args[i] = arguments[i];
    return args.sort();
}

Allerdings ist dies eine ziemlich erbärmliche Sache zu tun, nur um Zugang zu den äußerst nützlichen JavaScript-Array-Funktionen zu bekommen. Gibt es einen eingebauten Weg, um es mit der Standardbibliothek zu tun?

1 Stimmen

0 Stimmen

Es gefällt mir nicht, dass alle Antworten auf diese Frage die Absicht erkennen lassen, eine Sortierung vorzunehmen, und sort hat alle Antworten durchdrungen, aber das Sortieren war nur ein Beispiel von etwas, das Sie könnte tun mit einer geeigneten Anordnung. Die Absicht war, das Array zu erhalten. Ich kann die Frage nicht einmal tadeln, weil es richtig "zum Beispiel" heißt. Dennoch hat jede Antwort beschlossen, "sortieren" in das Beispiel für die Umwandlung der Argumente in ein Array einzubauen - manchmal zu eng, indem man das Sortieren mit dem Erhalten eines Arrays von Argumenten verwechselt.

9voto

Michał Perłakowski Punkte 79585

In ECMAScript 6 gibt es keine Notwendigkeit, hässliche Hacks wie Array.prototype.slice() . Sie können stattdessen verwenden verbreitete Syntax ( ... ) .

(function() {
  console.log([...arguments]);
}(1, 2, 3))

Es mag seltsam aussehen, ist aber ganz einfach. Es extrahiert einfach arguments Elemente und fügen sie wieder in das Array ein. Wenn Sie es immer noch nicht verstehen, sehen Sie sich diese Beispiele an:

console.log([1, ...[2, 3], 4]);
console.log([...[1, 2, 3]]);
console.log([...[...[...[1]]]]);

Beachten Sie, dass es in einigen älteren Browsern wie IE 11 nicht funktioniert. Wenn Sie also diese Browser unterstützen möchten, sollten Sie Babel .

6voto

Mystical Punkte 2064

Hier ist eine saubere und übersichtliche Lösung:

function argsToArray() {
  return Object.values(arguments);
}

// example usage
console.log(
  argsToArray(1, 2, 3, 4, 5)
  .map(arg => arg*11)
);

Object.values( ) gibt die Werte eines Objekts als Array zurück, und da arguments ein Objekt ist, wird es im Wesentlichen umgewandelt arguments in ein Array umzuwandeln, wodurch Ihnen alle Hilfsfunktionen eines Arrays zur Verfügung stehen, wie z. B. map , forEach , filter , usw.

5voto

Gheljenor Punkte 362

Hier ist der Benchmark von mehreren Methoden, die Argumente in Arrays umwandeln.

Für mich ist die beste Lösung für eine geringe Anzahl von Argumenten:

function sortArgs (){
  var q = [];
  for (var k = 0, l = arguments.length; k < l; k++){
    q[k] = arguments[k];
  }
  return q.sort();
}

Für andere Fälle:

function sortArgs (){ return Array.apply(null, arguments).sort(); }

0 Stimmen

+1 für Benchmarks. Derzeit zeigen die Diagramme Ihre sortArgs ist in Firefox 6-mal schneller, im neuesten Chrome jedoch doppelt so langsam, verglichen mit Array.apply .

1 Stimmen

Da Array.prototype.slice veraltet ist, weil es JS V8-Engine-Optimierung verhindern, halte ich dies für die beste Lösung, bis ES6 weithin verfügbar sein wird +1

1 Stimmen

Außerdem sind generische Array-Methoden wie Array.slice() ebenfalls veraltet

4voto

jjbskir Punkte 6635

Ich empfehle die Verwendung von ECMAScript 6 Spread-Operator , die die hinteren Parameter an ein Array bindet. Mit dieser Lösung müssen Sie nicht die arguments Objekt und Ihr Code wird vereinfacht. Der Nachteil dieser Lösung ist, dass sie in den meisten Browsern nicht funktioniert, so dass Sie stattdessen einen JS-Compiler wie Babel verwenden müssen. Unter der Haube transformiert Babel arguments in ein Array mit einer for-Schleife.

function sortArgs(...args) {
  return args.sort();
}

Wenn Sie kein ECMAScript 6 verwenden können, empfehle ich Ihnen, sich einige der anderen Antworten anzusehen, z. B. von @Jonathan Fingland

function sortArgs() {
    var args = Array.prototype.slice.call(arguments);
    return args.sort();
}

4voto

Michał Perłakowski Punkte 79585

Utilisez Array.from() die ein Array-ähnliches Objekt (wie arguments ) als Argument und wandelt es in ein Array um:

(function() {
  console.log(Array.from(arguments));
}(1, 2, 3));

Beachten Sie, dass es in einigen älteren Browsern wie IE 11 nicht funktioniert. Wenn Sie also diese Browser unterstützen möchten, sollten Sie Babel .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X