对象数组 vs 嵌套对象?

17

我有一个非常基本的编程问题,希望你能为我解答。

我现在正在处理很多对象,我想知道在数组对象内搜索内容以及在嵌套对象内搜索内容哪种方式更好?

比如说,我可以用以下两种方式存储相同的数据样本:

data1 = [ 
{ "id":1, "key1: "value1", "key2:"value2"},
{ "id":2, "key1: "value1", "key2:"value2"},
{ "id":3, "key1: "value1", "key2:"value2"},
{ "id":4, "key1: "value1", "key2:"value2"},
.....
]

data2 = {
"id_1": { "key1: "value1", "key2:"value2"},
"id_2": { "key1: "value1", "key2:"value2"},
"id_3": { "key1: "value1", "key2:"value2"},
"id_4": { "key1: "value1", "key2:"value2"},
.....
}

现在的要求是从一个子对象中获取特定的属性。我们所知道的只有与其关联的id(而不是索引)。

如果我使用数组方法,我将不得不使用循环和数组过滤器来访问每个对象中的任何内容/值。这种方法似乎很繁琐,迭代每个子对象感觉非常低效。然而,当我看到经验丰富的程序员实现类似的数据样本时,他们似乎都大量使用数组。

如果我使用嵌套对象方法,我只需要调用 data2.id_2.key2 就可以获取特定的值。

哪种方法更受推荐?由于我将处理相当大的数据集,因此哪个选项会具有更好的性能?


2
当然,通过属性键访问速度要快得多。但是很容易对您的代码进行基准测试,您应该这样做。 - Denys Séguret
2
如果您需要对这些数据进行排序,应该使用数组。否则,请使用对象方式。 - Gwenc37
如果您需要访问单个项目并且已经拥有键而无需通过结构进行搜索,则使用哈希。对于这么小的结构,任何性能差异都可能微不足道。 - Tony Hopkinson
data2.id2.key2 在你发布的对象中会失败 ;) 为了公平起见,你可以使用 data1[1].key2 来处理数组。 - GillesC
谢谢。我明白对于小数据集来说,这不是一个值得探索的问题。但是我将使用大量图形对象作为子对象,并想知道哪种方式对我访问内部内容更快。我想数组排序对我并没有什么用处。 - Rishav Sharan
2
那么同时使用两者呢?这是一个真正的问题,也就是说我并不是在说这是解决方案 ;) - sp00m
2个回答

9
这是一种没有错误答案的问题。两种情况都足够好。这取决于具体情况。你需要考虑语义。你是要返回元素数组(例如用户列表等)还是只返回一个包含很多属性的对象?我猜这个结构应该取决于数据。 但请记住,通过属性 object.property 访问速度比 array[index] 更快。

谢谢。看起来在这种情况下我应该使用对象.属性。我现在不会将您的答案标记为最终答案,以防其他人想参与讨论。 - Rishav Sharan
1
我还应该注意到,对于大约90%的情况来说,使用哪种结构并不重要(从性能角度来看),因为在任何应用程序中都有很多其他地方可以更有效地提高性能,而不仅仅是改变属性访问类型。 - Dmitry Volokh
有趣,我本以为它们的速度是一样快的。你有支持这个说法的来源吗? - Emil Lundberg
@EmilLundberg 你可以在jsperf.com上进行一个小测试并检查一下。 - Dmitry Volokh

4

理解对象和数组以及何时使用它们

  • 什么是JavaScript中的对象,它们与数组有何不同?
  • 在什么情况下使用其中之一更有优势?

数组: 数组带有几个非常有用的本地方法。我们可以使用push()将新元素添加到现有数组实例中,并通过pop()删除数组中的最后一个元素。我们还可以使用splice()在索引i处删除n个元素和/或插入新元素。

对象: 将对象视为关联数组,即键值对列表。 这些键被称为对象属性。

检查属性或值是否存在

数组: 通常,在处理数组时,我们关心的不是索引,而是值。 我们经常执行的一项常见操作是检查某个值是否在数组中。 使用indexOf()方法很容易实现此操作。

对象: 与数组相反,我们通常想知道对象是否包含某个属性。通常,我们会编写一个函数,该函数以对象作为参数,并期望该对象包含某个属性集。此对象可能来自API或其他代码片段,我们不应该依赖于它具有我们期望的所有属性。在访问该属性后面的值之前,始终检查该属性是否存在是一个好习惯。对象带有hasOwnProperty()方法,可以让我们做到这一点。

摘自此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接