对象数组与包含对象的对象

时间:2013-12-28 04:52:19

标签: javascript jquery

您何时决定将一系列对象存储在一个数组中,而不是将对象存储在一个对象中?

对象数组

[ {id:100, score:13}, {id:101, score:666} ]

对象对象

{ 100:{id:100, score:13}, 101:{id:101, score:666} }

4 个答案:

答案 0 :(得分:1)

基本上你的问题是什么时候将数据存储为元组(数组中的对象)以及何时将数据存储为hashMap(对象的对象)

当你有很多随机密钥查找时,hashMap应该是首选的,因为你不必遍历数组中的所有记录来查找给定的密钥。

当您对数据进行一些分析时,例如根据对象中的某个键对数据进行排序,那么应该首选对象数组。

答案 1 :(得分:1)

这取决于您希望如何使用它们。例如,在这种情况下,您可以使用其中之一。该数组确实看起来像

[ {id:100, score:13}, {id:101, score:666} ]

但是对象的对象可以设计为键值对。所以,改为:

{ 100:{score:13}, 101:{score:666} }

然后,如果您知道score,则可以直接访问id值,而无需检查indexof或浏览整个数组/对象。

通过两个结构循环也会略有不同。对于对象数组,您可以使用forEach(或for循环0array.length),对于您使用的对象对象{{1} }(或Object.keys循环)。它也归结为特定的场景,你应该愿意使用它们(我个人更喜欢对象的对象)。

答案 2 :(得分:0)

部分原因与您以后如何访问,选择或缓存特定对象有关。

var arr = [ {id: 100, score: 13}, {id:101, score:666} ];

console.log(arr[0]); //Object {id:100... etc.

“对象数组”的方式可以让你更难以弄清楚你想以哪种方式访问​​一个元素,比如说,它是'id'属性(如果有更简单的方法,有人会请赐教):

function fn() {

    var myObj;

    arr.forEach(function(el,i,arr){
        if(arr[i].hasOwnProperty('id')) {
             if(arr[i].id == 100) {
             myObj = arr[i]; //myObj = {id:100, score:13}
          }
        }
    });

    //do something with myObj

}

对于对象的对象,如果您知道您正在尝试选择“id”属性为100的对象:

var someObj = { 100:{id:100, score:13}, 101:{id:101, score:666} };

function fn() {
    var myObj;

    myObj = someObj[100]; //myObj = {id: 100, score:13}

    //do something with myObj
}

答案 3 :(得分:0)

答案取决于

  • 您的要求。
    • 非功能性要求(数据量,操作频率,数据完整性要求等)。
    • 功能要求(您将对这些数据做什么?插入或查询?或转换?)
  • 区分哈希映射和数组的内置属性。(性能,内存使用等)
  • 为哈希映射和数组提供的API和工具的区别。

  • 在这里,对于Javascript,要求很重要,例如

    • 数据量
    • 将执行哪些操作,搜索或插入?(或另一个问题,是数据读取或写入的大多数操作?)
  • 以下是有关数据结构哈希映射和数组的一些事实,

    • 哈希映射对于随机密钥查找(常量时间)非常快
    • 对于序列元素插入和遍历所有元素(恒定时间)
    • ,数组非常快
  • 对于API和工具,一般来说这里没有太大的区别,因为你可以为两者编写代码,但是,