使用数组作为哈希表

时间:2014-10-09 14:44:48

标签: javascript arrays object coding-style

这基本上是javascript中的编程风格问题。

有时,当我编码时,我发现自己循环遍历一组数据,例如,一组用户:

var users = [
    {
        id: 'USER-435',
        name: 'James',
        email: 'james@gmail.com'
    },{
        id: 'USER-7897',
        name: 'Mark',
        email: 'mark@gmail.com'
    },{
        id: 'USER-2345',
        name: 'Harry',
        email: 'harry@gmail.com'
    }
] 

重要说明:此数据来自服务器,需要按顺序排列。

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

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

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

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

我只是想问一下人们对这种模式的看法,以及你是否有更好的方法。

2 个答案:

答案 0 :(得分:2)

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

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

但是,我对你的特定问题有一个建议。为什么不在名为'by_id'的数组上创建一个属性,并使其成为您通过id索引的对象。

users.by_id['USER-2345'];

它解决了“额外变量”问题,密钥破坏问题以及代码在启动时变得不言自明。

祝你好运。

PS - 还可以查看underscore.js或lodash - 他们有一些例程可以让这种事情变得非常简单。他们会为你节省大量时间。

答案 1 :(得分:0)

我会在这里使用Array.filter。类似的东西:

users.filter( function (v) { return v.id === 'USER-435'; } );

在一个功能中:

function findUser(id) {
  var user = users.filter( function (v) { return v.id === id; } );
  return user.length ? user[0] : {id: 'not found'};
}

这需要循环,但是在你的数组包含超过一百万个元素之前,我不会担心。引用Tony Hoare:

  

我们应该忘记效率低,大约97%的时间说:   过早优化是万恶之源。

另见MDN
而且(公平地说)也是FALLACY OF PREMATURE OPTIMIZATION