用于键/值对的Javascript中的对象与数组

假设你有一个非常简单的数据结构:

(personId, name) 

…并且您想要将这些数据存储在一个JavaScriptvariables中。 正如我所看到的,你有三个select:

 // a single object var people = { 1 : 'Joe', 3 : 'Sam', 8 : 'Eve' }; // or, an array of objects var people = [ { id: 1, name: 'Joe'}, { id: 3, name: 'Sam'}, { id: 8, name: 'Eve'} ]; // or, a combination of the two var people = { 1 : { id: 1, name: 'Joe'}, 3 : { id: 3, name: 'Sam'}, 8 : { id: 8, name: 'Eve'} }; 

如果你有(或者期望你可能有)多于一个的“价值”部分来存储(例如,在他们的年龄或某物上增加),第二个或第三个选项显然是要走的路,所以为了争辩,让我们假设在这个结构中永远不会有更多的数据值。 你select哪一个,为什么?


编辑 :示例现在显示最常见的情况:非顺序ID。

每个解决scheme都有其用例。

我认为如果你想要定义一对一的关系(比如一个简单的映射),第一个解决scheme是好的,尤其是如果你需要使用这个键作为查找键。

第二种解决scheme对我来说一般来说是最健壮的,如果我不需要快速查找键,我可能会使用它:

  • 它是自我描述的,所以你不必依赖任何使用人的人知道关键是用户的id。
  • 每个对象都是自包含的,这更适合将数据传递到别处 – 而不是只传递给人们的两个参数(id和name)。
  • 这是一个罕见的问题,但是有时候这些关键值可能不适合用作关键字。 例如,我曾经想映射string转换(例如,“:”到“>”),但由于“:”不是一个有效的variables名,所以我不得不使用第二种方法。
  • 它很容易扩展,以防在某些地方需要向一些(或全部)用户添加更多数据。 (对不起,我知道你的“为了论点的缘故”,但这是一个重要的方面。)

如果你需要快速的查找时间+上面列出的一些优点(传递数据,自我描述),那么第三个就是好的。 但是,如果您不需要快速查找时间,则会更麻烦。 另外,无论哪种方式,如果对象中的id与的id不同,那么就会冒错误的风险。

其实,还有第四种select:

 var people = ['Joe', 'Sam', 'Eve']; 

因为你的价值观是连续的。 (当然,你必须添加/减less一个—或者只是把undefined作为第一个元素)。

就个人而言,我会和你的(1)或(3)一起去,因为那些用ID(O log n最差)查找的人是最快的。 如果你必须在(2)中findid 3,你可以通过索引来查找(在这种情况下,我的(4)可以)或者你必须search-O(n)。

澄清:我说O(log n )是最差的,因为AFAIK和执行可能决定使用平衡树而不是散列表。 假设碰撞最小,哈希表将是O(1)。

从nickf编辑:我已经改变了在OP中的例子,所以这个答案可能没有多less意义了。 道歉。

后期编辑

好的,编辑后,我会select选项(3)。 它是可扩展的(易于添加新属性),具有快速查找function,并且可以迭代。 它也可以让你从入门返回身份证,如果你需要。

如果(a)您需要节省内存,选项(1)将会很有用; (b)你永远不需要从对象回到id; (c)您永远不会扩展存储的数据(例如,您不能添加该人的姓氏)

如果您(a)需要维护订购,选项(2)是好的; (b)需要迭代所有元素; (c)不需要通过id来查找元素,除非它是通过idsorting的(你可以在O(log n )中进行二进制search。当然,如果你需要保持它的sorting,那么你将支付插入成本。

我创build了一个小库pipe理关键值对。

https://github.com/scaraveos/keyval.js#readme

它使用

  • 一个存储密钥的对象,允许快速删除和值检索操作
  • 一个链表,允许真正的快速迭代

希望它有助于:)

假设数据永远不会改变,第一个(单个对象)选项是最好的。

结构的简单性意味着它是parsing速度最快的,而在小的,很less(或者从不)变化的数据集的情况下,我只能想象它将被频繁执行 – 在这种情况下,最小的开销是要走的路。

第三种select是任何前瞻性应用程序的最佳select。 您可能希望将更多的字段添加到您的人员logging中,因此第一个选项是不合适的。 另外,很有可能你会有大量的人存储,并且希望快速查找logging – 因此将它们转储到一个简单的数组中(就像在选项#2中所做的那样)也不是一个好主意。

第三种模式使您可以select使用任何string作为ID,具有复杂的Person结构,并在固定的时间内获取和设置人员logging。 这绝对是要走的路。

#3缺less的一件事是一个稳定的确定性sorting(这是选项#2的好处)。 如果你需要这个,我build议保持一个有序的人员IDarrays作为一个单独的结构,当你需要按顺序列出人员。 好处是你可以保留多个这样的数组,对于同一个数据集的不同顺序。

鉴于你的限制,你只会有名字作为价值,我会select第一个选项。 它是最干净的,有最less的开销和最快的查找。