Как я могу преобразовать & ldquo; аргументы & rdquo; объект в массиве в JavaScript?

hm .. У меня была такая же проблема в моем текущем проекте, и я закончил использование хрустальных отчетов и назвал отчет веб-сервисом asp.net, написанным на c #. веб-сервис не имеет ничего сложного, и вы все равно можете использовать все функции хрустальных отчетов. Я не думаю, что вы найдете какой-либо механизм отчетов, который полностью основан на php, который можно сравнить с хрустальными отчетами ... Я не смог найти его еще ...

418
задан animuson 16 December 2014 в 04:49
поделиться

3 ответа

ES6 с использованием параметров отдыха

Если вы можете использовать ES6, вы можете использовать:

Параметры отдыха

 функцию sortArgs (... args) {return args.sort ( function (a, b) {return a - b;}); } document.body.innerHTML = sortArgs (12, 4, 6, 8) .toString (); 

Как вы можете прочитать в ссылке

Синтаксис остальных параметров позволяет нам представлять неопределенное количество аргументы как массив.

Если вам интересно узнать о ... синтаксис, он называется Оператор распространения , и вы можете прочитать больше здесь .

ES6 с использованием Array.from ()

Использование Array.from :

 function sortArgs () {return Array.from (arguments) .sort (function (a, b) {return a - b;}); } document.body.innerHTML = sortArgs (12, 4, 6, 8) .toString (); 

Массив. из просто конвертировать объекты типа Array или Iterable в экземпляры Array.



ES5

Фактически вы можете просто использовать функцию Array slice для объекта аргументов, и она преобразует ее в стандартный массив JavaScript. Вам просто нужно будет сослаться на него вручную через прототип массива:

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

Почему это работает? Что ж, вот отрывок из самой документации ECMAScript 5 :

ПРИМЕЧАНИЕ : функция slice намеренно является универсальной; он не требует, чтобы его значение this было объектом Array. Поэтому его можно передать другим видам объектов для использования в качестве метода. Возможность успешного применения функции slice к хост-объекту зависит от реализации.

Следовательно, slice работает со всем, что имеет свойство length , что удобно для arguments .


Если Array.prototype.slice слишком для вас это очень сложно, вы можете немного сократить его, используя литералы массива:

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

Однако я склонен полагать, что предыдущая версия является более явной, поэтому я бы предпочел ее. Злоупотребление буквальным обозначением массива кажется хакерским и выглядит странным.

704
ответ дан 22 November 2019 в 23:20
поделиться

Если вы используете jQuery, на мой взгляд, гораздо проще запомнить следующее:

function sortArgs(){
  return $.makeArray(arguments).sort();
}
9
ответ дан 22 November 2019 в 23:20
поделиться
function sortArgs(){ return [].slice.call(arguments).sort() }

// Returns the arguments object itself
function sortArgs(){ return [].sort.call(arguments) }

Некоторые методы массива намеренно сделаны так, чтобы не требовать, чтобы целевой объект был реальным массивом. Они требуют, чтобы у цели было только свойство с именем length и индексы (которые должны быть нулевыми или большими целыми числами).

[].sort.call({0:1, 1:0, length:2}) // => ({0:0, 1:1, length:2})
29
ответ дан 22 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: