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.

4voto

Zane Punkte 4474

Lodash:

var args = _.toArray(arguments);

in Aktion:

(function(){ console.log(_.toArray(arguments).splice(1)); })(1, 2, 3)

produziert:

[2,3]

6 Stimmen

Warum nicht _.toArray ?

5 Stimmen

Mais _.toArray angemessener ist.

0 Stimmen

Ich würde argumentieren, dass _.slice besser geeignet ist, da man oft einige führende Argumente weglassen möchte.

3voto

Abk Punkte 1949
function sortArg(){
var args = Array.from(arguments); return args.sort();
}

 function sortArg(){
    var args = Array.from(arguments); 
    return args.sort();
    }

 console.log(sortArg('a', 'b', 1, 2, '34', 88, 20, '19', 39, 'd', 'z', 'ak', 'bu', 90));

1voto

Eine andere Antwort.

Schwarzmagische Zaubersprüche verwenden:

function sortArguments() {
  arguments.__proto__ = Array.prototype;
  return arguments.slice().sort();
}

Firefox, Chrome, Node.js und IE11 sind OK.

6 Stimmen

Dies ist definitiv die beste Lösung... wenn Sie Ihren Code komplett unlesbar machen wollen. Außerdem, __proto__ ist veraltet. Siehe MDN-Dokumente .

1voto

guest271314 Punkte 1

Versuchen Sie es mit Object.setPrototypeOf()

Erläuterung: Stellen Sie ein. prototype de arguments à Array.prototype

function toArray() {
  return Object.setPrototypeOf(arguments, Array.prototype)
} 

console.log(toArray("abc", 123, {def:456}, [0,[7,[14]]]))

Erläuterung: Nehmen Sie jeden Index von arguments Platzieren Sie das Element in einem Array am entsprechenden Index des Arrays.

könnte alternativ verwenden Array.prototype.map()

function toArray() {
  return [].map.call(arguments, (_,k,a) => a[k])
} 

console.log(toArray("abc", 123, {def:456}, [0,[7,[14]]]))

Erläuterung: Nehmen Sie jeden Index von arguments Platzieren Sie das Element in einem Array am entsprechenden Index des Arrays.

for..of Schleife

function toArray() {
 let arr = []; for (let prop of arguments) arr.push(prop); return arr
} 

console.log(toArray("abc", 123, {def:456}, [0,[7,[14]]]))

ou Object.create()

Erläuterung: Objekt erstellen, Eigenschaften des Objekts auf Elemente bei jedem Index von arguments Satz prototype des erstellten Objekts an Array.prototype

function toArray() {
  var obj = {};
  for (var prop in arguments) {
    obj[prop] = {
      value: arguments[prop],
      writable: true,
      enumerable: true,
      configurable: true
    }
  } 
  return Object.create(Array.prototype, obj);
}

console.log(toArray("abc", 123, {def: 456}, [0, [7, [14]]]))

0 Stimmen

Sie haben sich Leute fragen ob Ihre Antwort die Warnung unter der Frage über "lange Antworten" erfüllt. Meines Erachtens besteht das Hauptproblem Ihrer Antwort darin, dass Sie nicht erklären por qué sollte man eine der Methoden anwenden, die Sie hier zeigen. Ich würde auf keinen Fall eine der von Ihnen vorgeschlagenen Lösungen verwenden, weil sie alle schlechter sind als die Lösungen in der akzeptierten Antwort. Zum Beispiel ist Ihr Verweis auf das Dokument von Object.setPrototypeOf warnt, dass es sich um einen "sehr langsamen Vorgang" handelt. Warum um alles in der Welt sollte ich das verwenden? Array.prototype.slice.call ?

0 Stimmen

@Louis Aktualisierte Antwort mit Erklärungen für jeden Ansatz. Die Frage im OP scheint zu lauten "Gibt es eine eingebaute Möglichkeit, dies mit der Standardbibliothek zu tun?" , nicht "warum man eine der Methoden anwenden sollte" die eingebaut sind? Wie könnte ein Benutzer, der eine Antwort veröffentlicht hat, genau feststellen, ob die veröffentlichten Lösungen "richtig" für den OP sind? Es sieht so aus, als ob es an OP liegt, dies zu bestimmen? Dieser Teil der Benachrichtigung ist es, der diesen Benutzer interessiert: "Begründen Sie, warum Ihre Antwort richtig ist" . Steht in einer der Antworten auf diese Frage: "Diese Antwort ist "richtig", weil: x,y,z"?

0 Stimmen

Ich habe erklärt, wie SO im Allgemeinen funktioniert. Ob der Auftraggeber wissen will, warum die eine Lösung besser ist als die andere, ist völlig irrelevant, denn die für SO gestellten Fragen sind nicht hauptsächlich für den Auftraggeber, sondern für die Hunderte und Tausende von Menschen, die die Frage und ihre Antworten später lesen werden. Außerdem sind die Leute, die über die Antworten abstimmen, nicht verpflichtet, so abzustimmen, wie es dem Fragesteller gefällt.

0voto

Matrix Punkte 3208

Benshmarck 3 Methoden :

function test()
{
  console.log(arguments.length + ' Argument(s)');

  var i = 0;
  var loop = 1000000;
  var t = Date.now();
  while(i < loop)
  {
      Array.prototype.slice.call(arguments, 0); 
      i++;
  }
  console.log(Date.now() - t);

  i = 0,
  t = Date.now();
  while(i < loop)
  {
      Array.apply(null, arguments);
      i++;
  }
  console.log(Date.now() - t);

  i = 0,
  t = Date.now();
  while(i < loop)
  {
      arguments.length == 1 ? [arguments[0]] : Array.apply(null, arguments);
      i++;
  }
  console.log(Date.now() - t);
}

test();
test(42);
test(42, 44);
test(42, 44, 88, 64, 10, 64, 700, 15615156, 4654, 9);
test(42, 'truc', 44, '47', 454, 88, 64, '@ehuehe', 10, 64, 700, 15615156, 4654, 9,97,4,94,56,8,456,156,1,456,867,5,152489,74,5,48479,89,897,894,894,8989,489,489,4,489,488989,498498);

ERGEBNIS?

0 Argument(s)
256
329
332
1 Argument(s)
307
418
4
2 Argument(s)
375
364
367
10 Argument(s)
962
601
604
40 Argument(s)
3095
1264
1260

Viel Spaß!

1 Stimmen

Ich möchte vorschlagen, den Text wie folgt zu ändern arguments.length == 1?[arguments[0]]:Array.apply(null, arguments); um zu verhindern, dass die Funktion mit nur einem ganzzahligen Argument aufgerufen wird dummyFn(3) und verursacht Ergebnis [,,]

0 Stimmen

@nevermind gute Arbeit, ich editiere, deine Version ist besser ;) Aber ich verstehe nicht dummyFn(3) Was ist das? Diese Funktion gibt es nicht...

0 Stimmen

Äh... egal, nur ein Beispiel, das zeigen soll, wie eine Funktion, die mit nur einem Integer-Argument aufgerufen wird, ein leeres Array mit fester Größe erzeugt, sorry für mein Englisch.

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