Как я могу преобразовать объект «arguments» в массив в JavaScript? - PullRequest
417 голосов
/ 07 июня 2009

Объект arguments в JavaScript является странной бородавкой - в большинстве случаев он действует как массив, но на самом деле это не объект массива. Поскольку это на самом деле что-то совсем другое , он не имеет полезных функций из Array.prototype, таких как forEach, sort, filter и map.

Тривиально легко создать новый массив из объекта аргументов с простым циклом for. Например, эта функция сортирует свои аргументы:

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

Однако это довольно жалкая вещь, которую нужно сделать, просто чтобы получить доступ к чрезвычайно полезным функциям массива JavaScript. Есть ли встроенный способ сделать это с помощью стандартной библиотеки?

Ответы [ 21 ]

3 голосов
/ 11 сентября 2016
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));
1 голос
/ 30 января 2016

Попробуйте использовать Object.setPrototypeOf()

Пояснение: Установите prototype из arguments в Array.prototype

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

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

Объяснение: Возьмите каждый индекс arguments, поместите элемент в массив с соответствующим индексом массива.

может альтернативно использовать Array.prototype.map()

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

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

Объяснение: Возьмите каждый индекс arguments, поместите элемент в массив с соответствующим индексом массива.

for..of петля

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

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

или Object.create()

Объяснение: Создать объект, установить свойства объекта для элементов с каждым индексом arguments; установить prototype созданного объекта на 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]]]))
1 голос
/ 10 июля 2014

Другой ответ.

Использовать заклинания черной магии:

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

Firefox, Chrome, Node.js, IE11 в порядке.

0 голосов
/ 13 февраля 2019

Вот чистое и краткое решение:

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

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

Object.values( ) вернет значения объекта в виде массива, а поскольку arguments является объектом, он по существу преобразует arguments в массив, предоставляя вам все вспомогательные функции массива, такие как map, forEach, filter и т. д.

0 голосов
/ 24 декабря 2017

Вы можете создать функцию многократного использования, чтобы сделать это с любыми аргументами, самый простой из которых выглядит примерно так:

function sortArgs() {
  return [...arguments].sort();
}

sortArgs('ali', 'reza', 1, 2, 'a'); //[1, 2, "a", "ali", "reza"];

Синтаксис распространения может использоваться в ES6 и выше ...

Но если вы хотите использовать что-то совместимое с ES5 и ниже, вы можете использовать Array.prototype.slice.call, поэтому ваш код выглядит следующим образом:

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

sortArgs('ali', 'reza', 1, 2, 'a'); //[1, 2, "a", "ali", "reza"];

Есть также несколько других способов сделать это, например, используя Array.from или перебрать аргументы и назначить их новому массиву ...

0 голосов
/ 22 апреля 2017

Объект Arguments доступен только внутри тела функции. Хотя вы можете индексировать объект аргументов как массив, это не массив. Он не имеет никаких свойств массива, кроме длины.

// function arguments length 5
function properties(a,b,c,d,e){
var function_name= arguments.callee.name
var arguments_length= arguments.length;
var properties_length=  properties.length; 
var function_from= properties.caller.name;
console.log('I am the function name: '+ function_name);
console.log('I am the function length, I am function spacific: '+ properties_length); 
console.log('I am the arguments length, I am context/excution spacific: '+ arguments_length);
console.log('I am being called From: '+  function_from );
}

// arguments 3
function parent(){
properties(1,2,3);
}

//arguments length 3 because execution spacific
parent();

Хотя его можно индексировать как массив, как вы можете видеть в этом примере:

function add(){

var sum=0;

for(var i=0; i< arguments.length;i++){

sum = sum + arguments[i];

}

return sum;

}

console.log(add(1,2,3));

Однако объект Arguments не является массивом и не имеет никаких других свойств, кроме длины.

Вы можете преобразовать объект arguments в массив, после чего вы сможете получить доступ к объекту Arguments.

Есть много способов получить доступ к объекту аргументов внутри тела функции, и они включают в себя:

  1. Вы можете вызвать метод Array.prototoype.slice.call.

Array.prototype.slice.call (аргументы)

function giveMeArgs(arg1,arg2){

var args = Array.prototype.slice.call(arguments);
return args
}

console.log( giveMeArgs(1,2));
  1. Вы можете использовать литерал массива

[]. Slice.call (аргументы).

function giveMeArgs(arg1,arg2){

var args = [].slice.call(arguments);

return args;

}

console.log( giveMeArgs(1,2) );
  1. Вы можете использовать Отдых ...

function giveMeArgs(...args){

return args;

}

console.log(giveMeArgs(1,2))
  1. вы можете использовать спред [...]

function giveMeArgs(){

var args = [...arguments];
return args;

}

console.log(giveMeArgs(1,2));
  1. Вы можете использовать Array.from ()

function giveMeArgs(){

var args = Array.from(arguments);

return args;

}

console.log(giveMeArgs(1,2));
0 голосов
/ 09 июля 2016
 function x(){
   var rest = [...arguments]; console.log(rest);return     
   rest.constructor;
 };
 x(1,2,3)

Я попробовал простую технику разрушения

0 голосов
/ 30 января 2016

Хотя остальные параметры работают хорошо, если вы хотите продолжить использовать arguments по какой-то причине, рассмотрите

function sortArgs() {
  return [...arguments].sort()
}

[...arguments] можно считать своего рода альтернативой Array.from(arguments), которая также отлично работает.

Альтернатива ES7 - это понимание массива:

[for (i of arguments) i].sort()

Это может быть проще, если вы хотите обработать или отфильтровать аргументы перед сортировкой:

[for (i of arguments) if (i % 2) Math.log(i)].sort()
0 голосов
/ 29 января 2016

function sortArgs(...args) {
  return args.sort(function (a, b) { return a - b; });
}

document.body.innerHTML = sortArgs(1, 2, 3, 4).toString();
0 голосов
/ 19 июня 2013

Это очень старый вопрос, но я думаю, что у меня есть решение, которое немного легче набрать, чем предыдущие решения, и не зависит от внешних библиотек:

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