Подсчитать размер массива в битах / байтах

У меня есть массив в Javascript, в котором много подмассивов. Каким будет лучший / самый простой способ подсчитать, сколько бит / байтов хранится в массиве? Я собираюсь отправить массив на свой PHP-сервер, и он не может быть больше 5 КБ.

А есть для этого нативный метод? Я не очень хорошо знаком с битами. Если я правильно понял, 1 символ умещается в 8b / 1B (хотя, очевидно, это зависит от кодировки). Было бы лучше всего перебрать все массивы и подсчитать символы?


person lawls    schedule 14.10.2013    source источник
comment
Взгляните на эту ссылку. stackoverflow.com/a/11900218/4836581 выглядит более точным.   -  person Zvi Redler    schedule 10.02.2020


Ответы (3)


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

Возможные варианты сериализации массива: метод jQuery.param() или _ 2_. Вы также можете создать свой собственный метод, который преобразует значения, чтобы ваш PHP-код мог это понять.

После того, как у вас есть эта строка, вы берете stringValue.length * 8, чтобы получить размер, предполагая, что а) значения являются ASCII или б) вы закодировали все значения в URL-адресе, чтобы символы Unicode преобразовывались в ASCII. *8 предназначен для получения битов, но поскольку вы упомянули, что ограничение составляет 5 КБ - это, скорее всего, байты, поэтому вы пропустите умножение.

person Knaģis    schedule 14.10.2013
comment
Цитата jQuery.param docs: Примечание. Поскольку не существует универсально согласованной спецификации для строк параметров, невозможно закодировать сложные структуры данных с помощью этого метода таким образом, который идеально работает на всех языках, поддерживающих такой ввод. Вместо этого используйте формат JSON в качестве альтернативы для кодирования сложных данных. - person Prinzhorn; 14.10.2013
comment
Оператор хочет знать, сколько байтов содержит массив. ваше решение не учитывает дополнительные символы, которые представляют массивы [] и " и т.д., поэтому в соответствии с вашим решением - [1] имеет длину 3, что неверно (оно имеет длину 1). - person Royi Namir; 14.10.2013
comment
@RoyiNamir Это то, что он сказал, но я не думаю, что он имел в виду. Если он может передать на сервер только 5 КБ, то учитывается длина сериализованных данных. И [1] имеет длину 8, потому что JavaScript хранит 1 как 64-битное число с плавающей запятой IEEE 754. Понимаете, вопрос у него неоднозначный. - person Prinzhorn; 14.10.2013
comment
@Prinzhorn Я читал: сколько байтов в массиве. вот мой ответ был о. :-) - person Royi Namir; 14.10.2013
comment
@RoyiNamir Я читал: я собираюсь отправить массив на свой PHP-сервер, вот о чем был мой ответ. :-). Но хватит;) - person Prinzhorn; 14.10.2013

Вы можете сделать это: (чтобы получить действительно хорошую оценку)

var g = JSON.stringify(myBigNestedarray).replace(/[\[\]\,\"]/g,''); //stringify and remove all "stringification" extra data
alert(g.length); //this will be your length.

Например: взгляните на этот вложенный массив:

var g=[1,2,3,['a','b',['-','+','&'],5],['שלום','יגבר']]

JSON.stringify(g).replace(/[\[\]\,\"]/g,'')

 "123ab-+&5שלוםיגבר"

Какая его длина: 17 (байтов)

Таким образом, вы используете преимущества json.parse, которые выполняют большую часть работы, а затем удаляете лишние держатели массива.

person Royi Namir    schedule 14.10.2013

Для получить размер массива в байтах при преобразовании в строку.

Примеры:

const myArray = [{test: 1234, foo: false, bar: true}];

console.info(new Blob([JSON.stringify(myArray)]).size); // 38

person P Roitto    schedule 16.03.2020
comment
осторожно с этим, я думаю, что это довольно элегантно для одноразового использования, но я столкнулся с огромными утечками памяти при использовании этого для измерения размера массива, который я использую в качестве буфера для очень быстрых входящих данных веб-сокета (измеряется каждые 5 секунд по мере его роста) ... он полностью увеличил использование памяти с 25 МБ в начале до 1 ГБ за считанные минуты ... очень странно - person exside; 18.09.2020