hm .. У меня была такая же проблема в моем текущем проекте, и я закончил использование хрустальных отчетов и назвал отчет веб-сервисом asp.net, написанным на c #. веб-сервис не имеет ничего сложного, и вы все равно можете использовать все функции хрустальных отчетов. Я не думаю, что вы найдете какой-либо механизм отчетов, который полностью основан на php, который можно сравнить с хрустальными отчетами ... Я не смог найти его еще ...
Если вы можете использовать ES6, вы можете использовать:
функцию sortArgs (... args) {return args.sort ( function (a, b) {return a - b;}); } document.body.innerHTML = sortArgs (12, 4, 6, 8) .toString ();
Как вы можете прочитать в ссылке
Синтаксис остальных параметров позволяет нам представлять неопределенное количество аргументы как массив.
Если вам интересно узнать о ...
синтаксис, он называется Оператор распространения , и вы можете прочитать больше здесь .
Использование 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.
Фактически вы можете просто использовать функцию 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);
Однако я склонен полагать, что предыдущая версия является более явной, поэтому я бы предпочел ее. Злоупотребление буквальным обозначением массива кажется хакерским и выглядит странным.
Если вы используете jQuery, на мой взгляд, гораздо проще запомнить следующее:
function sortArgs(){
return $.makeArray(arguments).sort();
}
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})