1

我有一个数组,我要循环两次,一个是从指针 0 向上循环,另一个是向后循环。

但是他们在 console.log 中产生了不同的数组布局,我觉得这很奇怪..这就是我所拥有的:

//array has a length of 3 [0,1,2]
var data = [],
    data2 = [];
for(var i = 0; i < array.length-1; i++){
 data[i] = {};
 data[i].test = 'Hello';
}
for(var i = array.length - 1; i > 0; i--){
 data2[i] = {};
 data2[i].test = 'Hello';
}
console.log(data);
console.log(data2);

现在在我的控制台日志中,它们会像这样不同:

在此处输入图像描述

那么为什么第二个的长度为 3 但只有 2 个对象呢?为什么第二个 console.log 的对象前面有数字,与第一个不同?

4

2 回答 2

2

lengthan的Array就是max(index) + 1

当您创建“稀疏”数组时,中间索引仍被视为存在。

console.log(JSON.stringify(data2));
// [null, {"test":"Hello"}, {"test":"Hello"}]

即使实例本身没有它们。

console.log('0' in data2);
// false

如果您想要使用的键的计数,您可以获得length它的Object.keys()

console.log(Object.keys(data2).length);
// 2

可能只过滤索引。

Object.indexes = function (target) {
    return Object.keys(target).filter(function (key) {
        return key === String(parseInt(key, 10));
    });
};

console.log(Object.indexes(data2).length);

请注意,这些片段需要基于 ES5 的引擎或 polyfill。

于 2013-08-18T03:33:35.497 回答
0

您的内部循环具有以下持续条件:

i > 0

这会在它到达 data2[0] 位置之前停止它。

因此,您要设置 data2[2],然后设置 data2[1]。data2[0] 仍未设置,但它仍在数组中(它仍然是指针位置)。

这就是你要找的

for(var i = array.length - 2; i >= 0; i--){
 data2[i] = {};
 data2[i].test = 'Hello';
}
于 2013-08-18T03:32:42.327 回答