这基本上是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',但是它感觉不是很干净。
我也可以为集合创建一个单独的对象,而不是在数组中创建新属性,但这将创建一个我需要处理的新对象。
我只是想问一下人们对这种模式的看法,以及你是否有更好的方法。
答案 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