嗨,我遇到了一个奇怪的JS / JQuery问题。
我有2个数组,其中包含一个时间戳和一个值。我将这两个数组合并在一起,以便如果两个数组中的时间戳相同,则创建一个带有时间戳,value1和value2的数组。 (value1在第一个数组中,value2在第二个数组中)
这是我为此编写的代码。 value[0]
是时间戳记
var combinedArray = [];
$.each(data.new, function(key, value) {
combinedArray[value[0]] = [value[0], value[1]];
});
$.each(data.repeat, function(key, value) {
combinedArray[value[0]].push(value[1]);
});
如果我将其登录到浏览器,则如下所示:
您可以看到combinedArray
确实有多个值,所以我不确定为什么长度为0。
这是一个问题,是因为我需要遍历当前无法执行的combinedArray
。
答案 0 :(得分:2)
数组的索引超出了正的32位整数值的有效范围。
来自Array#length
:
作为对象
length
的实例的对象的Array
属性设置或返回该数组中的元素数。该值是一个无符号的32位整数,在数值上总是大于数组中的最高索引。
var array = [];
array[1541030400000] = 'foo';
console.log(array.length);
console.log(array);
console.log(array[1541030400000]);
要解决此问题,您可以采用不带毫秒的时间戳,并采用较小的值作为数组的索引。
然后可以使用标准方法对数组进行迭代。
答案 1 :(得分:2)
如here所述,数组的长度必须小于2的32的幂。
您的时间戳大于2到32的幂,因此不能是数组索引。
如果创建数组a = []
并分配给特定的索引a[33] = 'hi'
,则前33个值将不确定。但是,如果您分配给的索引大于2 ** 32,则不会创建先前的值,因此数组的长度将为0。
如果您使用大于2 ** 32的值作为索引,它将被视为属性。因此,如果您愿意,可以尝试遍历数组的属性。
我建议不要使用combinedArray[value[0]]
来创建属性,而是使用以下数组来迭代:
var combinedArray = [];
var timestampIndices = [];
$.each(data.new, function(key, value) {
combinedArray.push([value[0], value[1]]);
timestampIndices.push(value[0]);
});
$.each(data.repeat, function(key, value) {
let index = timestampIndices.indexOf(value[0]);
combinedArray[index].push(value[1]);
});