有关唯一ID的数据结构最佳实践

时间:2012-04-02 11:10:27

标签: javascript

我有这两种数据结构,我不断发现自己在从数据库中提取数据时选择:

{
    "1": {"location": "seattle", "color": "red"},
    "2": {"location": "irvine", "color": "blue"},
    "3": {"location": "san diego", "color": "green"}
}

{
    "listings":[
        {"id": "1", "location": "seattle", "color": "red"},
        {"id": "2", "location": "irvine", "color": "blue"},
        {"id": "3", "location": "san diego", "color": "green"}
    ]
}

每个人似乎都有利有弊......

对象结构非常适合快速访问给定id的值,方法是obj['3'].color列出所有对象时必须循环使用for(key in obj)循环,这似乎是非常慢的问题。< / p>

使用for(var i=0; i<array.length; i++),数组结构的循环速度要快得多,但访问给定id的值并不容易开箱即用。你必须创建一个循环遍历整个数组的函数,根据提供的参数检查id。

这是两个解决方案的jsperf

您认为哪个更好,为什么?

1 个答案:

答案 0 :(得分:1)

与往常一样,答案是:取决于。您是否主要通过id随机访问对象?然后使用该对象。你会主要按顺序循环它们吗?然后使用数组。

当然,您可以通过返回一个数组,然后通过id值在其上创建索引来执行这两项操作。如,

var arr = /*...wherever you get your second example, the array...*/;
var index, len, entry;
arr.index = {};
for (index = 0, len = arr.length; index < len; ++index) {
    entry = arr[index];
    arr.index[entry.id] = entry;
}

(我有一个这样做的功能,因为我发现它是一种有用的技术。)

现在,您可以循环遍历它们,或通过arr.index["some_id"]随机访问它们。请注意,修改它时必须小心(例如,确保在两个位置都进行删除和添加)。

请注意,我在实际数组上使用了一个名为index的属性(名称可以是您喜欢的名称;我经常使用indexbyId或类似名称)。有些人不喜欢在数组上使用非索引属性;我没有问题,因为数组are really just objects anyway。但是,您不必这样做,您可以将自己变量中的索引作为arr的同伴跟踪。

另请注意,尽管在对象上使用for..in与阵列上的for进行迭代的速度可能存在绝对差异,但存在的可能性对迭代速度的任何现实影响非常低。

相关问题