Javascript 数组查找效率:关联与存储关联?

2023-12-29

我一直在阅读,他们说关联数组不会给你提供与数组相同的效率。关联数组可以在 O(N) 时间内查找内容,而数组可以在 O(1) 时间内查找内容。

这是我的问题:在快速查找值并且不占用太多内存方面,哪一个更有效?

联想:

var myVars=new Array(); 
myVars['test1'] = a;
myVars['test2'] = b;
myVars['test3'] = c;
... (up to 200+ values)

echo myVars['test2'];

存储关联:

var myVars=new Array(); 
var TEST1 = 1;
var TEST2 = 2;
var TEST3 = 3;
... (up to 200+ values)

myVars[TEST1] = a;
myVars[TEST2] = b;
myVars[TEST3] = c;
... (up to 200+ values)

echo myVars[TEST2];

一、第一次使用Array是错的。虽然它是possible去做,并不意味着你应该这样做。您正在“滥用”数组也是对象的事实。这可能会导致意外的行为,例如尽管您添加了 200 个值,myVars.length0.

不要使用 JavaScript 数组作为关联数组。为此使用普通对象:

var myVars = {}; 
myVars['test1'] = a;
myVars['test2'] = b;
myVars['test3'] = c;

其次,在 JavaScript 中,两者(对象和数组)之间没有真正的区别。数组扩展了对象并添加了一些行为,但它们仍然是对象。元素存储为数组的属性。

您可以在以下位置找到更多信息规格 http://ecma262-5.com/ELS5_HTML.htm#Section_15.4:

Array objects give special treatment to a certain class of property names. A property name P (in the form of a String value) is an array index if and only if ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal to 232−1. (...)

So both:

var obj = {'answer': 42};
obj['answer'];

and

var arr = [42];
arr[0];

have the same access time, which is definitely not O(n).

†: 更好的说法是should有。显然,这在不同的实现中有所不同。


除此之外,你的第二个例子很难维护。如果将数字分配给变量,为什么不直接使用数字呢?

var myVars = []; 
myVars[0] = a;
myVars[1] = b;
myVars[2] = c;

Update:

更重要的是:您必须根据您的需求选择正确的数据结构,这不仅取决于单个元素的访问时间,还取决于:

  • 键是连续数字还是任意字符串/数字?
  • 您是否必须访问集合的所有(即循环所有)元素?

数值数组(数组)和关联数组(或哈希表/映射(JS 中的对象))针对不同的问题提供了不同的解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 数组查找效率:关联与存储关联? 的相关文章

随机推荐

  • Angular 7 api没有被调用

    我正在尝试调用 API 但我认为出了问题 import map from rxjs operators import Injectable from angular core import HttpClient from angular c
  • 要“新”还是不“新”

    使用时是否有可遵循的经验法则new声明对象时何时不使用关键字 List
  • ubuntu linux上的虚拟socat串口和c#

    出于测试目的 我尝试编写一个简单的程序来连接到使用 socat 创建的虚拟串行端口 我使用以下命令创建串行端口 socat d d PTY b9600 PTY link ttyVS1 b9600 得到这个输出 2011 11 08 18 2
  • 如何向 Visual Studio 2010 shell 添加 C# 语言支持?

    问候 我正在使用 Visual Web Developer Express 2010 进行一些开发 我还安装了 Visual Studio 2010 Shell 我用它来调试服务器和客户端代码 使用 调试 gt 附加到处理 命令 我的问题是
  • 无法使用 XPath 表达式定位 LABEL 的元素

    我正在尝试使用下面的 xpath 作为标签 但我无法找到该元素 driver findElement By xpath div label contains text Patient s Name isEnabled XPath id up
  • Openshift 上的 WordPress 响应速度非常慢

    我刚刚将我的 Wordpress 网站移至 OpenShift PAAS 生态系统上的可扩展 PHP 盒上 但我立即注意到该网站的响应速度非常慢 大约 3000 4000 毫秒 但是 当它开始响应时 页面加载 渲染速度绝对很快 这是网址 h
  • onclick 事件不适用于选项

    以下是我的代码 在 Firefox 中运行良好 但在 chrome 中则不行 请让我知道如何解决这个问题 主要思想是根据选择框的选定值调用js函数
  • 如何以编程方式确定我的应用程序正在 iPhone、iPad 或 iPhone 4 上运行?

    我刚刚使用 cocos2d 完成了我的 iPhone 游戏 但在将其发布到 AppStore 之前 我想让它在 iPad 屏幕更大 和 iPhone 4 分辨率更大 上运行 那么 我如何以编程方式确定我的应用程序正在 iPhone iPad
  • Rabbitmq:在无限循环中重新处理失败的消息

    这是我的rabbitmq配置
  • 如何在 ObservableCollection 上执行 foreach lambda 表达式?

    我如何执行foreachObservableCollection 上的 lambda 表达式 没有方法foreach与 ObservableCollection 一起使用 尽管此方法与 List 一起存在 有没有可用的扩展方法 BCL 中默
  • 惰性初始状态 - 它是什么以及如何使用它?

    我是新来反应 Hooks 的 我正在尝试利用useState在我的代码中 当我使用它时 我发现了一个术语 惰性初始状态 https reactjs org docs hooks reference html lazy initial sta
  • 质数 JavaScript

    有人可以指导我在这里获取素数吗 这是家庭作业 所以我不想要答案 但如果有一些指示 我将不胜感激 这真的让我很烦 我想我已经很接近了 但我遇到的问题是 25 和 35 这些不是素数 但这个函数正在返回它们 var getPrimeNumber
  • 在本机应用程序中使用 Webrtc

    我的问题是 1 是否可以在我的 Native App 中拥有一个 WebView 由 Native 框架提供 实例 并扩展它以支持 Webrtc 如果 1 为 是 则可能执行以下操作 1 在 Android 上构建 webrtc 2 在 A
  • Angular 2 和 Angularfire2 中的三向绑定

    我正在尝试使用 AngularFire 2 2 0 0 beta 2 将输入元素三路绑定到 Angular js 2 2 0 0 rc 4 中的 firebase 数据库 我有一个非常简单的 html 例如
  • 安装 ruby​​ 1.9.3 时遇到问题

    我通过命令安装了 ruby 1 9 3rvm install 1 9 3在 mac 的终端上 安装后我收到这些错误 见下文 有人有任何想法来解决这个问题吗 运行 configure prefix Users Keta rvm rubies
  • Flutter pdf 生成图像速度太慢

    我正在 flutter 中开发 pdf 生成器应用程序 但是当我想向 pdf 添加图像时 需要很长时间 我也想知道如何添加多个图像 我使用 3 个库 图像选择器 pdf 打印 这是我的代码 Future getImage async var
  • Caliburn Micro WPF 窗口管理

    我想使用 caliburn micro 启动一个 WPF 应用程序 这样我就可以尽可能地使用 TDD 我之前在 WP7 中使用过 caliburn micro 但 WPF 似乎是另一艘船 并且文档不完整与 WP7 一样 我已经用我的 Boo
  • 是否可以在 Scala 解释器中定义伴随类/模块?

    在 Scala 解释器中进行测试通常很方便 然而 我遇到的一个问题是 我必须重构使用隐式转换的代码 因为定义一个与现有类同名的对象does not使其成为 REPL 中的配套模块 因此 当我翻译回 真实源代码 时 我不能确信我的代码仍然可以
  • 临时和表达行为

    这是明确定义的行为吗 const char p std string Hello std string World c str std cout lt lt p 我不知道 原因 不 这是未定义的行为 两个都std string临时对象和返回
  • Javascript 数组查找效率:关联与存储关联?

    我一直在阅读 他们说关联数组不会给你提供与数组相同的效率 关联数组可以在 O N 时间内查找内容 而数组可以在 O 1 时间内查找内容 这是我的问题 在快速查找值并且不占用太多内存方面 哪一个更有效 联想 var myVars new Ar