在数组中获取超过4294967295个对象

时间:2018-10-23 13:10:59

标签: javascript arrays 32-bit

我想创建一个无限的64位数组。但是32位数组限制为仅4,294,967,295个对象。在长度为4,294,967,295的数组上使用push函数时,也会出现错误:Invalid array length如何创建64位数组?

2 个答案:

答案 0 :(得分:1)

根据ECMAScript definition,这是最大长度:

  

整数索引是一个字符串值的属性键,它是规范的   数字字符串(请参见7.1.16),其数字值为+0或a   正整数≤2 53 -1。数组索引是一个整数索引,其   数值i的范围是+0≤i <2 32 −1。

处理两个数组可能是个好主意。

答案 1 :(得分:0)

这是不可能的,因为您已经从@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);

因此,从理论上讲,有可能使一个对象充当由多个数组组成的数组,而您只是为正确的数组“计算”正确的索引。

我说理论上是因为该方法在客户端不起作用,因为大多数浏览器的窗口/选项卡都限制在特定的MB / GB内存(例如chrome和firefox)上。

但是Firefox中的限制更大,这就是我进行测试的地方。

之所以给出这个答案,是因为OP首先将这样数量的数据存储在客户端(我只假设它是客户端)是没有意义的,并且对于混合应用程序(可能)。

可以轻松扩展此方法以利用更多的空间(和内存)。也许有更好的方法,但这就是我的零花钱2美分。