我有这两种数据结构,我不断发现自己在从数据库中提取数据时选择:
{
"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。
您认为哪个更好,为什么?
答案 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
的属性(名称可以是您喜欢的名称;我经常使用index
或byId
或类似名称)。有些人不喜欢在数组上使用非索引属性;我没有问题,因为数组are really just objects anyway。但是,您不必这样做,您可以将自己变量中的索引作为arr
的同伴跟踪。
另请注意,尽管在对象上使用for..in
与阵列上的for
进行迭代的速度可能存在绝对差异,但存在的可能性对迭代速度的任何现实影响非常低。