0

Я пытался использовать типизированных массивов вместо массивов, чтобы уменьшить память: Javascript многомерный массив типизированных (Int8Array) пример

function createarrayInt8(numrows,numcols,number){ 
 
     
 
\t var arr = new Int8Array(numrows); 
 
      
 
\t for (var i = 0; i < numrows; ++i){ 
 
\t \t var columns = new Int8Array(numcols); 
 
\t \t for (var j = 0; j < numcols; ++j){ 
 
\t \t \t columns[j] = number; 
 
\t \t } 
 
\t \t arr[i] = columns; 
 
\t } 
 
    
 
\t return arr; 
 
}

Но я не могу создать многомерный массив типизированных. Почему? Должен ли я использовать только число «number» для Int8?

+0

Ну, типизированный массив может хранить только значения своего типа. Поэтому массив uint8 может хранить только неподписанные 8-битные целые числа, но не массивы (из uints). –

+0

Я почти так думал :). Но как он может получить многомерный массив, в котором хранятся только неподписанные 8-битные целые числа для уменьшения используемой памяти? –

ответ

4

Напечатанный Int8Array может содержать только 8-битные целые числа. Таким образом, arr[i] = columns не будет работать, поскольку столбцы имеют тип Int8Array, который не может быть преобразован и сохранен (любым значимым образом) в виде 8-разрядного целого.

Решение: Либо сделать arr общий Array, элементы которого могут быть массивами или - возможно, более продвинутые, но обычно более производительным решение - хранить многомерный массив как единый плоский массив размера numrows * numcols и доступ к элементу с помощью arr[column + row * numcols]:

var numrows = 5, numcols = 4; 
 
var arr = new Int8Array(numrows * numcols).fill(0); 
 

 
arr[3 + 1 * numrows] = 1; // col = 3, row = 1 
 

 
console.log (arr);