javascript - 使用数组作为哈希表

标签 javascript arrays hashmap coding-style hashset

这基本上是一个 JavaScript 编程风格问题。

有时,当我编码时,我发现自己循环访问数据集合,例如用户集合:

var users = [
    {
        id: 'USER-435',
        name: 'James',
        email: '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="cea4afa3abbd8ea9a3afa7a2e0ada1a3" rel="noreferrer noopener nofollow">[email protected]</a>'
    },{
        id: 'USER-7897',
        name: 'Mark',
        email: '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="98f5f9eaf3d8fff5f9f1f4b6fbf7f5" rel="noreferrer noopener nofollow">[email protected]</a>'
    },{
        id: 'USER-2345',
        name: 'Harry',
        email: '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e38b8291919aa3848e828a8fcd808c8e" rel="noreferrer noopener nofollow">[email protected]</a>'
    }
] 

重要提示:此数据来自服务器,并且需要按顺序排列。

如果我想通过 ID 获取特定用户的属性,我将必须循环遍历数组才能找到它。

所以我所做的就是循环遍历数组一次,并以用户 ID 作为键在数组中创建属性。这样我就可以使用每个用户的 ID 来访问它,而无需循环遍历数组。由于 = 运算符创建对对象的引用而不是副本,因此添加到数组中的每个属性都将是一个引用。

我发现的唯一问题是,如果用户的 ID 是数字,它将成为数组的一部分。因此,如果我们有一个包含 3 个用户的集合,其中一个 ID 为 120,则将数组的长度设置为 121。快速可以将属性添加为“id-120”,但感觉并不好非常干净。

我还可以为集合创建一个单独的对象,而不是在数组中创建新属性,但这将创建一个我需要处理的新对象。

我只是想问问人们对这种类型的模式有何看法,以及您是否有更好的方法。

最佳答案

您只有几种选择来完成此任务。将数组重新映射到对象以按键进行查找是一种非常常见的模式。

我不会太担心创建“users_by_id”对象,它不太可能给您带来太多麻烦(除非您的代码已经非常复杂)

但是,我对您的具体问题有一个建议。为什么不在数组上创建一个名为“by_id”的属性,并使其成为按 id 索引的对象。

users.by_id['USER-2345'];

它解决了“额外变量”问题、按键损坏问题,并且代码启动时变得不言自明。

祝你好运。

PS - 还可以查看 underscore.js 或 lodash - 他们有使这种事情变得非常容易的例程。它们会为您节省大量时间。

关于javascript - 使用数组作为哈希表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26281389/

相关文章:

java - 运行 HashMap 中的对象的方法

java - 如何通过键和值比较两个映射并将差异映射存储在结果映射中

javascript - 如何仅用两根手指在谷歌地图内移动?

javascript - JS : Recursively calling a promise function

c# - 在没有序列化的情况下深度复制数组c#

javascript - 返回数组javascript的最大值

javascript - 在放置事件后为每个具有不同 id 的图像添加不同的类

javascript - 如何使用父对象中对每个子对象的 ID 引用将主对象与子对象合并

linq - LINQ .Last、.Skip 等方法是否针对数组或 List<T> 进行了优化?

java - 从 Java HashMap 中删除零值