Получение более 4294967295 объектов в массиве - PullRequest
0 голосов
/ 23 октября 2018

Я хочу создать 64-битный массив, предел которого бесконечен.Но 32-битный массив ограничивается только 4 294 967 295 объектами.Я также получаю сообщение об ошибке при использовании функции push в массиве длиной 4 294 967 295: Invalid array length Как создать 64-разрядный массив?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Это невозможно, как вы уже узнали из @Amy и @sumitani.Однако вы можете реализовать свой собственный объект или «контейнер массива» или оболочку массива по своему усмотрению.

Я привел здесь базовый пример:

var MyArray = function(){

  var arr1 = [];
  var arr2 = [];

  this.push = function(element){
    if(arr1.length < 4294967296){
        arr1.push(element);
    }else if(arr2.length < 8589934592){
        arr2.push(element);
    }else{
        throw "Invalid array length";
    }
  }

  this.get = function(index){
    if(index <= 4294967296){
        return arr1[index];
    }else if(index <= 8589934592){
        return arr2[Math.floor(index / 4294967296)];
    }else{
        throw "Invalid Index";
    }

  }

  Object.defineProperty(this, 'length', {get: function() {
    return arr1.length + arr2.length;
    }});

};

var arr = new MyArray();


for(var i = 0; i < 8589934592; i++){
    arr.push(i);
}

console.log(arr.get(5));

console.log(arr.length);

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

Я говорю теоретически, потому что этот метод не будет работать на стороне клиента, как большинство браузеров.окна / вкладки ограничены определенной памятью в МБ / ГБ, такой как chrome и firefox.

Однако в Firefox ограничение больше, и именно здесь я провел свой тест.

Причина, по которой я даю этот ответ, заключается в том, что OP не имеет смысла хранить такой объем данных на клиенте (я предполагаю, что он только на стороне клиента), и это может быть полезно длягибридные приложения (возможно).

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

0 голосов
/ 23 октября 2018

Согласно определению ECMAScript это максимальная длина:

Целочисленный индекс - это ключ свойства со строковым значением, представляющий собой каноническую числовую строку (см. 7.1.16)и чье числовое значение равно +0 или положительное целое число ≤ 2 53 -1.Индекс массива - это целочисленный индекс, числовое значение i которого находится в диапазоне +0 ≤ i <2 <sup>32 -1.

Обработка двух массивов может быть хорошей идеей.

...