如何存储对象数组?

我有一个对象image我可以做像image.top这样的东西,它会返回一个值,或者我可以做image.myPoints[0].left ,它会返回一个值。 我基本上有这个图像对象为我存储值。 我希望能够将多个image对象放在一个数组中,这样我就可以这样做:

 $("#toPinpoint").mapImage({ useAjax: false, pinpoints: [ { "top": 50, "left": 280, "width": 200, "height": 200}, { "top": 0, "left": 0, "width": 300, "height": 74 } ] }); 

我使用此函数来创建对象,将针点添加到对象上。 当调用mapImage函数时,会发生以下情况:

  $.fn.mapImage = function(options){ //Set user input options and defaults var optionConfig = $.extend({}, $.fn.mapImage.defaults, options); image=this; this.image = this; // Assign defaults this.previewMode = optionConfig.previewMode; this.pinpoints = optionConfig.pinpoints; image.pinpoints = optionConfig.pinpoints; image.pinpointCount = 0; image.selected = 0; ...} 

这将设置图像属性,现在我想用我的应用程序修改特性,然后将这些image对象保存到数组中。

我的问题是数组正在加载图像对象,但它似乎用我刚刚推入的对象填充整个数组,因此它不会保存我的旧图像对象。 例如,如果我执行myArray[0].myPoints[0].left ,让我们说它重新打造30,然后我推送另一个myPoints [0] .left等于20的图像对象,这是我的第一个图像对象数组变成20而不是保存为30.如果这是解决这个问题的好方法,那将非常感激。 谢谢!

使用array.push(x)应该将x添加到array的末尾。 但是,它不会创建x的副本,因此如果您再更改x的属性并再次push()它,您的数组将包含两个带有更新属性的x实例 – 我怀疑这就是您所看到的。 (也就是说,您可能正在更改imagetop属性并再次push() ,而不是创建一个全新的image push() )。

 var myArray = new Array(); 

您需要使用“new”关键字。

我认为你使这比需要更复杂。

 (function($){ $.fn.mapImage = function(options) { var defaults = { /* your defaults here */ }; // Merge default options with passed in options and store options = ($.extend({}, defaults, options)); // Do other stuff }; })(jQuery); // Backup current pinpoints and modify the current one $('#toPinpoints').data('pinpoints-backup', $('#toPinpoints').data('pinpoints').splice()); $('#toPinpoints').data('pinpoints')[0].top = 100; // Push a new array of pinpoints $('#toPinpoints').data('pinpoints').push({"top": 100, "left": 50, "width": 200, "height": 150}); 

小心jQuery.extend()因为它不会递归操作,因此默认子数组中的任何数组都将被选项数组中的那些完全覆盖, 而不是合并。

如果您稍后需要访问精确定位数据,您可能希望通过执行类似this.data($.extend({}, $.fn.mapImage.defaults, options));来使用jQuery.data() this.data($.extend({}, $.fn.mapImage.defaults, options)); 而不是重新分配选项变量。 然后可以通过$('#toPinpoint').data('pinpoints')在任何地方访问给定元素$('#toPinpoint').data('pinpoints') ,它将返回通过选项传递给mapImage()的相同数组。 然后,您可以使用jQuery.each()遍历所有精确定位点。

如果我遗漏了你想要做的事情,请告诉我。