JS数组显然没有长度

时间:2019-04-25 09:20:23

标签: javascript jquery

嗨,我遇到了一个奇怪的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]);
});

如果我将其登录到浏览器,则如下所示:

Image

您可以看到combinedArray确实有多个值,所以我不确定为什么长度为0。

这是一个问题,是因为我需要遍历当前无法执行的combinedArray

2 个答案:

答案 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]);
});