如何在javascript中存储类似的对象

时间:2014-07-25 09:46:28

标签: javascript jquery arrays object

我试图在我的js代码中创建一个对象集合,有两种方式似乎都是合乎逻辑的。我想知道是否有“最佳实践”,以及为什么。虽然这似乎是一个基本问题,但我找不到太多关于它的内容。

让他们说他们是彩色物体。色调值是虚构的。 $是jQuery。

选项1:标识符为属性

我打电话给数据库方式&#39 ;;每个对象看起来像一个表行,并包含属于该行的所有字段。

colors = [
  {name: "red", hex: "ff0000", hue: 34},
  {name: "blue", hex: "0000ff", hue: 100}
]

添加颜色:

colors.push({name: "purple", hex: "ff00ff", hue: 100});

通过指定名称来获取颜色:

redObjs = $.grep(colors, function(c){return (c.name === "red");}); //array with 1 element //easier way?
hexOfRex = redObj[0].hex;

通过指定色调来获取颜色名称:

hueObjs = $.grep(colors, function(c){return (c.hue === 100);}); //array with 2 elements (color objects)
hueNames = hueObjs.map(function(c){return c.name;}); //array with 2 elements (strings)

选项2:标识符为键

这里,部分信息(nl标识符)没有存储在颜色对象中。

colors = {
  red: {hex: "ff0000", hue: 34},
  blue: {hex: "0000ff", hue: 100}
}

添加颜色:

colors["purple"] = {hex: "ff00ff", hue: 100};

通过指定名称来获取颜色:

redObj = colors["red"];
hexOfRed = redObj.hex //or directly colors["red"].hex;

通过指定色调来获取颜色名称:

hueNames = []; for (c in colors) {if (colors[c].hue === 100) hueNames.push(c);} //array with 2 elements (strings)

我可以想到每个人的一些(dis)优势,比如 选项1的优点:统一性和数据库相似性。数组而不是对象似乎是一种更自然的结构来存储非常相似的对象。 选项2的优点:至少在名称已知的情况下,检索信息的容易性和简短性。没有重复的颜色名称。

但这并没有真正帮助我挑选。还有其他需要考虑的论点吗?是一个正确的错误'或者认为是不好的做法,为什么?如果我总是拥有颜色名称并且永远不需要查找它是否重要(这似乎是选项2的主要问题)。

谢谢你们!

2 个答案:

答案 0 :(得分:0)

这取决于您拥有的数据大小以及您想要的性能类型。 在大多数情况下,第二个优化甚至不重要,除非您的数据行开始运行到几千或更多。 尝试使用jsperf.com对两种情况进行基准测试,并使用与您想要的大小完全相同的样本数据集。 如果peroformance几乎相同,请使用更清洁的数据格式。

答案 1 :(得分:0)

根据这个'数据库'的规模,webSQL可能更合适。否则我会说有相当多的考虑因素。 JS数组的数组模型或对象数组模型的内存或性能效率不高(http://0fps.net/2013/05/22/implementing-multidimensional-arrays-in-javascript/)。

但是,如果您只打算通过单个标识符访问数据,那么对象模型的对象在逻辑上最容易编写和访问。相反,在对象数组方法上执行属性查找会更容易,更快,因为它是具有定义长度的线性列表。遗憾的是,你会丢失快速标识符引用。

两者都是很好的做法,但你应该问自己哪些性能命中是可以接受的,同时尽可能保持代码的细长和可维护性。

相关问题