将Object传递给Array

时间:2016-02-13 10:13:58

标签: javascript arrays javascript-objects



var initGrid = function() {

  //creating a grid while initialising it
  var grid = [];

  // declaring each grid element as a Object having three properties
  var gridElement = {
    x: Number,
    y: Number,
    val: Number
  };

  for (var i = 0; i < 10; i++) {
    for (var j = 0; j < 10; j++) {
      gridElement.x = i;
      gridElement.y = j;
      gridElement.val = 0;
      grid.push(gridElement);
    };
  };

  return grid;
};

console.log(initGrid());
&#13;
&#13;
&#13;

当我在控制台上运行此代码时,网格阵列的所有对象都具有相同的x和y值,即9和9 ....

但我想根据循环变量创建具有不同值的对象

3 个答案:

答案 0 :(得分:1)

这是因为,Object是通过引用传递的。您将不得不在每次迭代中创建不同的对象。

以下是样本。

var initGrid = function() {

  //creating a grid while initialising it
  var grid = [];

  for (var i = 0; i < 10; i++) {
    for (var j = 0; j < 10; j++) {
      var gridElement = {}
      gridElement.x = i;
      gridElement.y = j;
      gridElement.val = 0;
      grid.push(gridElement);
    };
  };

  return grid;
};

console.log(initGrid());

答案 1 :(得分:0)

您没有以这种方式声明gridElement类型; Javascript不会这样做,Typescript会(但这不是重点)。

您会看到相同的值,因为您只有一个gridElement对象,即使用

创建的对象
var gridElement = {
  x: Number,
  y: Number,
  val: Number
};

,对于上下文,初始化一个对象,其属性xyval都指向Number构造函数。

每次循环迭代都会改变同一个对象,并将对该一个对象的引用推送到网格上,这样就不会有100个网格元素xy等于{{ 1}} - 您对同一个对象有100个引用,其中您写入9x的最后一个值都是y

例如,您可以按如下方式为每个循环创建新对象:

9

你可以声明一个for (var i = 0; i < 10; i++) { for (var j = 0; j < 10; j++) { var newGridElement = { x: i, y: j, val: 0 }; grid.push(newGridElement); console.log(newGridElement); }; }; 构造函数和你自己的类型,但是如果你真的需要它,你将会做类似你自己的defining a Javascript class

答案 2 :(得分:0)

您可以使用带有new运算符[MDN]的函数和实例的用户定义对象。这为数据结构提供了一个接口。

var initGrid = function () {
    var grid = [];

    function GridElement(x, y, val) {            // user-defined function
        this.x = x;                              // properties
        this.y = y;
        this.val = val;
    };

    for (var i = 0; i < 10; i++) {
        for (var j = 0; j < 10; j++) {
            grid.push(new GridElement(i, j, 0)); // use an instance of GridElement with new
        };
    };

    return grid;
};

document.write('<pre>' + JSON.stringify(initGrid(), 0, 4) + '</pre>');