【问题标题】:Array of Objects vs Nested Object?对象数组与嵌套对象?
【发布时间】:2014-09-13 00:20:31
【问题描述】:

我有一个非常基本的编程问题,希望您能解释一下。

我现在正在处理很多对象,我想知道是在对象数组中还是在嵌套对象中搜索内容更好?

例如,我可以通过以下两种方式存储相同的数据样本:

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 来获取该特定值。

推荐的做事方式是什么?我将使用相当大的数据集,所以选项会有更好的性能?

【问题讨论】:

  • 当然通过属性键访问要快得多。但是对你的代码进行基准测试很容易,你应该这样做。
  • 如果你需要对这些数据进行排序,你应该使用数组。否则,使用对象方式
  • 如果您需要访问单个项目并且您拥有密钥而无需在结构中搜索它,则使用散列。这么小的结构,任何性能差异都可能是微不足道的。
  • data2.id2.key2 会因您发布的对象而失败 btw ;) 为了公平起见,您可以使用 data1[1].key2
  • 那么using both at the same time 呢?这是一个真正的问题,也就是说,我并不是说这是解决方案;)

标签: javascript arrays object


【解决方案1】:

这是一种没有错误答案的问题。这两种情况都足够好。视情况而定。您应该考虑语义。您是返回元素数组(即用户列表等)还是仅返回具有很多属性的对象?我猜这个结构应该取决于数据。 但请记住,通过属性object.property 进行访问比array[index] 更快。

【讨论】:

  • 谢谢。在这种情况下,我似乎应该使用 object.property。我现在不会将您的答案标记为最后一个,以防万一其他人想对此发表意见。
  • 另外我应该注意到,对于大约 90% 的情况,使用哪种结构并不重要(从性能的角度来看),因为任何应用程序中都有很多其他地方可以提高性能仅更改属性的访问类型就非常有效。
  • 有趣的是,我猜他们都一样快。有资源支持吗?
  • @EmilLundberg 你可以在 jsperf.com 上做一个小测试并检查一下。
【解决方案2】:

了解对象与数组以及何时使用它们

  • 什么是对象,它们与 Javascript 中的数组有何不同?
  • 什么时候使用一个比另一个更有利?

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

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

检查属性或值是否存在

数组: 通常,当我们使用数组时,我们不太关心索引,而更关心值。 我们对数组执行的常见操作之一是检查某个值是否在数组中。 这很容易使用 indexOf() 方法完成。

对象: 与数组相比,我们通常想知道一个对象是否包含某个属性。通常我们会编写一个以 Object 作为参数的函数,并期望它包含一组特定的属性。这个对象可以来自 API 或其他一些代码,我们不应该依赖它具有我们期望的所有属性。在访问该属性背后的值之前检查该属性是否存在总是一个好主意。对象带有 hasOwnProperty() 方法,它允许我们这样做。

extracted from here

【讨论】:

    猜你喜欢
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多