Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как добавлять элементы в типизированный массив? (https://javascript.ru/forum/misc/78079-kak-dobavlyat-ehlementy-v-tipizirovannyjj-massiv.html)

NiOl 23.07.2019 23:55

Как добавлять элементы в типизированный массив?
 
Оказывается, push() с типизированными массивами не работает, присваивание по новому индексу тоже ничего не дает. Количество элементов заранее неизвестно. Как быть?

my_bf=new Uint8Array(0);
my_bf[0]=1;
my_bf[1]=2; //  для примера только 2 элемента
alert(my_bf.length); // длина осталась = 0


В крайнем случае можно подготовить данные в Array, а затем сконвертить в байты, но это потребление лишней оперативки (минимум в 4 раза больше), а количество элементов может доходить до сотни лямов и плюс лишнее действие на конвертирование, старые компы могут не потянуть, не говоря об телефонах.

SuperZen 24.07.2019 08:20

https://developer.mozilla.org/ru/doc...Array#Examples
// From an iterable 
var iterable = function*(){ yield* [1,2,3]; }(); 
var uint8 = new Uint8Array(iterable);

Alexandroppolus 24.07.2019 10:40

Uint8Array - это непрерывный кусок памяти. Его нельзя увеличивать. Так исторически сложилось, причём задолго до появления js. Единственный способ его "увеличить" - это создать новый, более крупный кусок, и скопировать данные из старого куска, старый передать сборщику мусора. В твоём случае, когда данные появляются постепенно, оптимальной будет стратегия с удвоением размера буфера - дополнительных издержек выходит где-то на 2N по памяти и примерно столько же копирований.
А вообще - какая задача? Нафига понадобилось все данные в массив запихнуть?

NiOl 24.07.2019 16:59

SuperZen,
Вчера смотрел эту публикацию, перед созданием темы. Поскольку типизированный массив не может создаться внезапно, Иттератор в данном случае будет заполнять обычный массив, (32бита на элемент, по-умолчанию) а потом перенесет все в байтовый. Вариант некрасивый.

Alexandroppolus,
Была мысль вообще создать 2-мерный массив с небольшими блоками по 16-32 байта и добавлять очередной блок по достижении границы... Некрасиво все это, в итоге вообще выйдет 4-мерный массив )))

* обрабатываю картинку, теоретически не более 50мпх (примерно на этом размере 32-битный фаяфокс-49 начинает подвисать. На выходе у меня 16 вариантов цветового решения на выбор пользователю, у каждого варианта до 16 (может уменьшу до 8) подвариантов конечной обработки. Уже 2-мерный массив, и еще помножить на список блоков, вот 4-мерность и получается ))))

Alexandroppolus 24.07.2019 17:17

Цитата:

Сообщение от NiOl
обрабатываю картинку, теоретически не более 50мпх (примерно на этом размере 32-битный фаяфокс-49 начинает подвисать.

ты это в браузере делашь, через канву? Но тогда у тебя данные уже в бинарном массиве - getImageData возвращает структурку с таким массивом. Зачем ещё один массив?

NiOl 25.07.2019 13:22

В "канве" превьюшки, данные отдельно )))
Пока склоняюсь к списку блоков по 256 байт. Нет времени попробовать.

SuperZen 25.07.2019 13:45

Сначал
Цитата:

Сообщение от NiOl (Сообщение 510588)
Количество элементов заранее неизвестно.

Потом
Цитата:

Сообщение от NiOl (Сообщение 510612)
* обрабатываю картинку, теоретически не более 50мпх

Проще сначала посчитать сколько надо и создать уже готовый вариант
new Uint8Array(x*y)

Alexandroppolus 25.07.2019 14:54

Цитата:

Сообщение от NiOl
данные отдельно

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

NiOl 01.08.2019 00:14

Цитата:

Сообщение от Alexandroppolus (Сообщение 510679)
и откуда берутся эти данные? просто интересно, как можно получить данные по пикселям изображения, причем не в виде бинарного массива, да ещё и таким образом, чтобы на момент получения первого пикселя было неизвестно, сколько их всего. Мутная какая-то история.

Главное, чтоб не криминальная )))

Мучаю конвертор графики под одну ретросистему. Пытаюсь не только в палитру попасть (это вроде получилось), но и хоть как-то поджать данные, ибо места на конечном устройстве мало. Отсюда и неизвестный заранее размер.
Уже выловил кучку ошибок, потом вспомнил, что хотел поставить "use strict" и понеслась новая партия исправлений... потом обнаружил, что 43й ФФ не поддерживает "let" (на одном из объектов приходится сидеть на старом компе с 512МБ ОЗУ)...
По ходу правок уже планирую некоторые моменты переделать с нуля.

SuperZen 01.08.2019 11:32

Цитата:

Сообщение от NiOl (Сообщение 511034)
потом обнаружил, что 43й ФФ не поддерживает "let"

...
Run your index.html in various browser such as Chrome,Firefox and Edge Browser, if your getting error message means the browser is not accepting ES6 javascript
So we have to convert our ES6 into ES5 script format.
How ??
We have use babel for converting ES6 to ES5....

взял тут https://medium.com/@zural143/basic-w...l-dc66e72c86c6


Часовой пояс GMT +3, время: 03:02.