这基本上是一个 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/