gpt4 book ai didi

javascript - 如何最好地使用非连续索引来处理 JavaScript 数组?

转载 作者:行者123 更新时间:2023-12-03 12:13:32 25 4
gpt4 key购买 nike

我正在用 JavaScript 编写一个 Google Chrome 扩展程序,我想使用一个数组来存储一堆对象,但我希望索引是特定的非连续 ID 号。

(这是因为我以后需要能够使用来自我无法控制的另一个来源的 ID 号有效地查找这些值。)

例如:

var myObjects = [] ;

myObjects[471] = {foo: "bar"} ;

myObjects[3119] = {hello: "goodbye"}

当我做 console.log(myObjects) ,在控制台中,我看到打印出整个数组,所有数以千计的“缺失”索引都显示 undefined .

我的问题是:这重要吗?这是在浪费内存吗?

即使它不浪费内存,当我循环遍历数组时,如果我必须手动跳过每个缺失值,它肯定会浪费 CPU?

我尝试使用对象而不是数组,但似乎您不能使用数字作为对象键。我希望有更好的方法来实现这一目标?

最佳答案

首先请大家了解一下,for-in statement所做的事情叫enumeration(虽然是一个IterationStatement),是为了和迭代区分开来。这非常重要,因为它会导致混淆,尤其是在初学者中。

回答 OP 的问题:它不会占用更多空间( test )(您可以说它依赖于实现,但我们正在谈论的是 Google Chrome 扩展!),而且它也不慢( test )。

然而我的建议是: 使用合适的!
在这种情况下:使用 对象 !

您想对它们做的显然是一种散列机制,无论如何, 键都会转换为字符串 ,因此您可以安全地使用对象来完成此任务。

我不会向您展示很多代码,其他答案已经这样做了,我只是想让事情变得清楚。

// keys are converted to strings 
// (numbers can be used safely)
var obj = {}
obj[1] = "value"
alert(obj[1]) // "value"
alert(obj["1"]) // "value"

Note on sparse arrays



稀疏数组 不会浪费任何空间 的主要原因是规范没有这么说。没有必要要求属性访问器检查内部 [[Class]] 属性是否为“数组”,然后将每个元素从 0 < i < len 创建为值 undefined 等。它们恰好是 undefinedtoString 方法在数组上迭代时。它基本上意味着 他们不在那里

11.2.1 属性访问器

产生式 MemberExpression : MemberExpression [ Expression ] 的评估如下:
  • 让 baseReference 成为评估 MemberExpression 的结果。
  • 设 baseValue 为 GetValue (baseReference)。
  • 让propertyNameReference 为计算表达式的结果。
  • 让 propertyNameValue 为 GetValue (propertyNameReference)。
  • 调用 CheckObjectCoercible (baseValue)。
  • 让 propertyNameString 为 ToString (propertyNameValue)。
  • 如果正在评估的语法产生包含在严格模式代码中,则让 strict 为 true ,否则让 strict 为 false
  • 返回类型为 Reference 的值,其基值为 baseValue,其引用名称为 propertyNameString,其严格模式标志为严格。

  • 产生式 CallExpression : CallExpression [ Expression ] 的求值方式完全相同,只是包含的 CallExpression 在步骤 1 中求值。

    ECMA-262 第 5 版 ( http://www.ecma-international.org/publications/standards/Ecma-262.htm )

    关于javascript - 如何最好地使用非连续索引来处理 JavaScript 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4771001/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com