【问题标题】:how can know lenght my array in javascript如何在javascript中知道我的数组的长度
【发布时间】:2021-11-05 02:32:13
【问题描述】:

我在 JavaScript 中有这段代码

    var items_in_cart = [];
    items_in_cart['rr'] = 1;
    items_in_cart['mm'] = 2;
alert(items_in_cart.length);

我得到 0

如果将代码更改为

items_in_cart[50] = 1;
items_in_cart[77] = 2;

我得到 78 但这个数组只有两个元素

谢谢

【问题讨论】:

  • Arrays 不适用于 key-value 对。您正在滥用数组。改为使用对象。
  • 对于第一部分,数组不应该像在 js 中那样使用,如果你想使用自定义键,请使用 object 代替......至于第二部分,从索引 0 到 76 的所有内容(不包括50)是undefined,试试console.log(items_in_cart[75])...这是因为它们没有用任何值初始化。数组是元素链,即使第 76 个为空,也无法创建第 77 个索引,因此您的数组长度为 78 而不是 2

标签: javascript html arrays


【解决方案1】:

JavaScript 中的数组是标准对象,对称为 array indexes 的属性名称类进行了特殊处理(名称都是规范整数形式的数字,其数值为 >= 0 和 < 2³²-1),特殊处理length 属性,并使用Array.prototype(通常)作为其原型。由数组索引名称命名的属性称为“元素”。其他属性只是属性。

数组的length 属性始终等于数组包含的最高数组元素索引加一。在您的第一个代码块中,没有数组元素(只有非元素属性),所以length0。在您的第二个中,最高数组元素索引是77,所以length78

如果您要在第一个代码块中使用非数组元素属性,通常最好使用非数组对象 ({}),而不是数组 []

如果你想知道一个对象有多少个属性,你可以使用Object.keys(如果你不关心继承的或不可枚举的属性)。这足以让您 2 为您的初始代码块:

const items_in_cart = {}; // I've made this a non-array object
items_in_cart['rr'] = 1;
items_in_cart['mm'] = 2;
console.log(Object.keys(items_in_cart).length); // 2

或者您可以使用Object.getOwnPropertyNames(对于以字符串命名的)和/或Object.getOwnPropertySymbols(对于以符号命名的),它们也不包括继承的属性,但包括不可枚举的属性。您可以使用for-in 循环来获取所有继承的可枚举属性的计数。要获得 所有 属性(无论是自己的还是继承的、可枚举的还是不可枚举的)的计数,您必须在对象上使用getOwnPropertyNames 和/或getOwnPropertySymbols 编写一个循环,然后使用@ 987654325@ 转到它的原型对象,依此类推,直到到达原型链的末尾。

如果您想知道一个稀疏数组(如您的第二个)有多少 元素,这是我可能会使用的非常少数几个地方之一reduce (可能通过将其包装在一个有用的名称如getSparseCount 的函数中):

function getSparseCount(array) {
    // `reduce` only visits existing elements, not holes in a sparse array
    const count = theArray.reduce(c => c + 1, 0);
    return count;
}

const items_in_cart = [];
items_in_cart[50] = 1;
items_in_cart[77] = 2;
console.log(getSparseCount(items_in_cart));

function getSparseCount(array) {
    // `reduce` only visits existing elements, not holes in a sparse array
    const count = array.reduce(c => c + 1, 0);
    return count;
}

【讨论】:

    【解决方案2】:

    数组不支持命名条目,因此您需要更改为对象,然后您可以检查有多少键来获取项目数量:

    var items_in_cart = {};
    items_in_cart['rr'] = 1;
    items_in_cart['mm'] = 2;
    
    console.log(items_in_cart)
    console.log(Object.keys(items_in_cart).length)

    【讨论】:

    • 嗯,他们确实支持命名条目(console.log(items_in_cart['mm']);,但不是您期望的方式(TJ 的回答)。
    【解决方案3】:

    您以错误的方式使用数组!尝试为此目的使用字典:

    var items_in_cart = {};
        items_in_cart['rr'] = 1;
        items_in_cart['mm'] = 2;
    alert(items_in_cart.length);
    

    【讨论】:

      猜你喜欢
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 2012-10-06
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多