【问题标题】:Array.length is 0 even when it contains values - JavascriptArray.length 为 0,即使它包含值 - Javascript
【发布时间】:2015-10-10 11:05:02
【问题描述】:

我有一个包含子数组的父数组。父数组上的length 属性显示 0 个结果,即使存在子数组也是如此。

代码如下:

var balances = [];
balances['kanav'] = 50;
balances['yash'] = 50;

alert(balances.length);
console.log(balances);

什么原因?

【问题讨论】:

  • 请在您的问题中添加相关的minimal reproducible example代码;不要只链接到电子热资源。
  • length 属性定义为最高索引加 1,如果不包含任何索引,则为 0。这些属性不算作索引。
  • @Xufox — 不完全是,length 至少是最高索引加一。它可以更高(例如var a = new Array(8).
  • 为什么会有这么多反对票?用 JSFiddle 示例解释问题。我做错什么了吗?
  • 它看起来像一个数组,但它是一个对象!这里有很好的解释:stackoverflow.com/questions/2528680/…

标签: javascript arrays multidimensional-array


【解决方案1】:

length 属性仅适用于数值型数组属性。数组只是具有特殊 length 属性和一些从 Array.prototype 继承的方便方法的对象。

当您添加像 kanavyash 这样的属性时,它们会被添加为普通对象属性,而不是索引,因此不会影响 length .

var arr = [];

// Add plain object properties
arr.foo = 'foo';
arr.bar = 'bar';

document.write(arr.length) // 0

// Add some numeric properties
// Since they are numbers, square bracket notation must be used
arr[9] = 9;

document.write('<br>' + arr.length) // 10

【讨论】:

【解决方案2】:

在您的示例中, balances 不是一个数组,它实际上是一个关联数组(它们都是对象,但它们有不同的方法)。

如果你想使用数组,你可以

var balances = [
    ["kanav", 50],
    ["yash", 50]
];
alert(balances.length);
console.log(balances);

如果您想保持当前格式,则必须遍历对象以对其进行计数

var balances = [];
balances['kanav'] = 50;
balances['yash'] = 50;

var i=0;
for(var key in balances) {
    if(balances.hasOwnProperty(key)) {
        i++;
    }
}
console.log(i);

【讨论】:

  • balances 是一个数组,也是一个对象。这仍然没有回答问题。
【解决方案3】:

您将数组用作 json 对象,但数组处理索引或推送函数。因此,如果您以这种方式使用它,它将产生正确的结果。

var balances = [];
balances.push('something');
balances.push('another');

alert(balances.length);
console.log(balances);

或者在这个语法中:

var balances = [];
balances[0] = 50;
balances[1] = 50;

alert(balances.length);
console.log(balances);

【讨论】:

    【解决方案4】:

    balances 是一个关联数组。 根据this的帖子,可以得到它的长度,方法是:

    Object.size = function(obj) {
        var size = 0, key;
        for (key in obj) {
            if (obj.hasOwnProperty(key))
                size++;
        }
        return size;
    };
    
    var balances = [];
    balances['kanav'] = 50;
    balances['yash'] = 50;
    
    alert(Object.size(balances));
    console.log(balances);
    

    【讨论】:

      猜你喜欢
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 2017-09-28
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多