【问题标题】:Array length is not correct in javascriptjavascript中的数组长度不正确
【发布时间】:2019-04-23 07:46:26
【问题描述】:

我有一个像下面这样的数组

  arr=[];
  arr[0]={"zero": "apple"};
  arr[1]={"one": "orange"};
  arr["fancy"]="what?";

但当我执行console.log(arr.length) 时,我得到 length2,即使我能够控制所有值。 并且在执行 console.log(JSON.stringify(arr)) 时无法获取所有值 这里有什么问题。

这里是小提琴fiddle的链接

【问题讨论】:

  • 您希望arr["fancy"]="what?"; 成为长度的一部分?
  • 所有数组当然都有一个length 属性(这是你的问题的全部内容),所以按照你显然期望的逻辑,[].length 应该是1(因为它有一个length 财产)。通常,将字符串键添加到数组不是一个好主意 - 但如果您确实需要使用它们,那么不,它们不会影响自动更新的 length 属性。
  • 在执行 console.log(JSON.stringify(arr)) 时无法获取所有值

标签: javascript node.js


【解决方案1】:

.length 是 Javascript 数组中的一个特殊属性,它被定义为“数组中最大的数字索引加一”(或 2^32-1,无论先出现什么)。顾名思义,这不是“元素的数量”。

当您迭代数组时,可以直接使用for..ofmap,也可以间接使用例如JSON.stringify,JS 只是循环从 0 到 length - 1 的所有数字,如果在这个数字下有一个属性,则输出/返回它。它不会查看其他属性。

【讨论】:

  • 在执行 console.log(JSON.stringify(arr)) 时无法获取所有值
【解决方案2】:

length 属性在hashtablesassociative arrays 的数组上无法正常工作。此属性仅适用于数字索引数组(并且归一化,即没有孔)。但是有一种方法可以获取associative array 的长度,首先您必须使用Object.keys(arr)associative array 中获取键列表,然后您可以在此列表上使用长度属性(即标准化索引大批)。就像下一个例子一样:

arr=[];
arr[0]={"zero": "apple"};
arr[1]={"one": "orange"};
arr["fancy"]="what?";

console.log(Object.keys(arr).length);

关于下一个问题:

在执行 console.log(JSON.stringify(arr)) 时无法获取所有值

您的 arr 元素的格式不正确,无法成为 JSON。如果您希望它是 JSON,请检查下一个示例的语法:

jsonObj = {};
jsonObj[0] = {"zero": "apple"};
jsonObj[1] = {"one": "orange"};
jsonObj["fancy"] = "what?";

console.log(Object.keys(jsonObj).length);
console.log(JSON.stringify(jsonObj));

【讨论】:

  • 在执行 console.log(JSON.stringify(arr)) 时无法获取所有值
  • @NIshamMahsin 更新了对您评论的回答。
【解决方案3】:

来自 MDN 对数组的描述,here,“数组不能使用字符串作为元素索引(如在关联数组中),但必须使用整数。”

换句话说,这不是 Javascript 数组语法 arr["fancy"]="what?";

这会导致.length 出现错误。

【讨论】:

  • 不知道谁在 MDN 上写了那段,但这很愚蠢。 MDN 只是一个 wiki,而不是权威来源,您需要仔细检查您在那里阅读的所有内容。
  • @georg,请阅读此相关问题link 的已接受答案。也许关联数组和数组之间存在混淆。另请参考this,在 arrays are objects 部分下。
  • 是的,那里也有同样的困惑。数组中没有专用的“数据存储”,您可以完美地为其分配字符串属性。事实上,所有数组属性都是字符串属性,即使它们看起来像整数。
  • @georg ,.. 和here,在关联数组混淆部分下,var myAssocArray = []; myAssocArray["foo"] = "bar";“上面的例子是一个滥用的数组对象。上面代码之所以有效,仅仅是因为数组也是对象。”
  • 我建议您阅读权威来源,ECMA 标准,而不是随机的互联网帖子,该标准清楚地说明了数组是什么,什么不是。这是链接:ecma-international.org/ecma-262/9.0/…。玩得开心!
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 2020-11-18
  • 2013-01-26
相关资源
最近更新 更多