如何在数组中存储对象的不同状态?

时间:2011-02-16 19:58:34

标签: javascript jquery

我有一个名为apples的对象,如果我执行apples[0].weight之类的操作,则会返回一个值。现在我希望能够存储apples的数组。让我们调用数组myApples。如何将apples的多个实例添加到myApples数组,而不将值更改为最新的值。例如:

apples[0].weight = 10;
apples[1].weight = 20;
myApples.push(apples);
apples[0].weight = 15;
apples[1].weight = 16;
myApples.push(apples);

现在如果我要打印值myApples[0].apples[0].weight我得到15而不是得到10.我认为它是因为引用是相同的数组,所以每次更改它时它都会更新。我将如何存储这些apple“状态”,以便我可以记录对其所做的更改。请记住,我想让这个任意,所以我不得不做像apples1,apples2,apples3这样的东西,因为对此的更改可能是无限的。(在我的实际项目中,我将精确点存储在画布上,所以我基本上可以执行“撤消”和“重做”功能,并希望每次在画布上发生更改时都存储这些精确定位的值。)

编辑 - 这是我applespinpoints

的方式
var options = {pinpoints: [ { "top": 50,
                           "left": 280,
                           "width": 200,
                           "height": 200},
                         { "top": 0,
                           "left": 0,
                           "width": 300,
                           "height": 74 } ]}    
var optionConfig = $.extend({}, $.fn.mapImage.defaults, options);
var myPinpoints = optionConfig.pinpoints;

所以,如果我做myPinpoints [0]。左边它给了我280,我希望能够将myPinpoints推入一个数组,然后将myPinpoints [0] .left更改为其他内容,然后再将其推送到数组并保存两个值

5 个答案:

答案 0 :(得分:1)

那么你还需要什么“苹果”呢?

myApples.push([
  { weight: 10 },
  { weight: 20 }
]);
myApples.push([
  { weight: 15 },
  { weight: 16 }
]);

现在,如果苹果不仅仅是“重量”,那么你可能需要一个苹果制造商的功能:

function makeApple(weight, variety, color) {
  return {
    weight: weight,
    variety: variety || "Braeburn",
    color: color || "red"
  };
}

然后你可以这样做:

myApples.push([
  makeApple(10, "Fuji"),
  makeApple(20, "Granny Smith", "green")
]);

或其他什么。

编辑 - 正如费利克斯金指出的那样,“苹果”的本质并不是非常明确。在任何情况下,无论“苹果”是什么,我个人都倾向于制作一个更加面向功能的设置来创建对象,数组,或对象数组,或者它们是什么。

答案 1 :(得分:1)

您可以使用jQuery.clone类型的API来克隆Object并将其移动到Stack或Queue。 这样,您可以确保单独维护对象状态。

答案 2 :(得分:0)

我认为对象apple是基于参考的。因此,即使将它们推送到阵列上,当您将值更改为15时,仍然会更改第一个苹果对象。请尝试使用关键字“new”。

var apples1 = new int[99];
var apples2 = new int[99];

apples1[0].weight = 10;
apples1[1].weight = 20;
myApples.push(apples1);
apples2[0].weight = 15;
apples2[1].weight = 16;
myApples.push(apples2);

答案 3 :(得分:0)

安东尼,

为什么不使用二维数组呢? e.g。

var apples = new Array(100);
apples[0]  = new Array(2);
apples[0][0] = {weight: 0};
apples[0][1] = {weight: 1};
apples[1]  = new Array(2);
apples[1][0] = {weight: 10};
apples[1][1] = {weight: 11};

此致         尼尔

答案 4 :(得分:0)

现在,我在这里了解的更多,我将如何做到这一点。首先定义包含x,y输入的坐标对象。接下来设置一个堆叠这些精确定位点/坐标的方法,我假设您正在处理x,y网格。我正在松散地编写这段代码并且没有进行测试,所以请耐心等待。

    // declare an array in global scope
var CoordinateCollection = new Array();

// create an object model
function Coordinate(x,y) { 
    this.x = x;
    this.y = y;
}

// this function will push a new coordinate onto the array
function AddCoordinate(x,y) { 
    CoordinateCollection.push(new Coordinate(x,y));
}

// after calling AddCoordinate you could now
// say something like
// alert(CoordinateCollection[0].x);
// if you call it again you could say
// alert(CoordinateCollection[1].x);
// and it would have a different value if the
// two original values were different.

编辑...

您可以省略对AddCoordinate的调用并使用其中的行。