如何在Javascript中创建数组数组?

时间:2013-10-23 17:20:41

标签: javascript arrays string loops object

我一直在打扰这一段时间,所以我终于崩溃并决定要求输入。

我必须构造一个使用坐标数组来勾画地图的对象。我已经创建了一个数组数组(至少我认为),所以我可以遍历长度并创建所需的许多对象。问题是,我的Array中的值是字符串 - 它们实际上并不是引用数组。然后该对象生气并说它是一个无效的参数。

我尝试使用split(),但似乎没有效果。我手动输入路径:boundary0,这似乎工作得很好。我一直在看这个,我想我已经失去了脑细胞。如果有人甚至可以让我走上正确的道路,那就太棒了。

var arrays = 50; //Set this to how many arrays are created.

var boundariesAr = new Array;
var boundaries = new Array;
for(i=0;i<arrays;){
    boundariesAr.push('boundaries' + i);
    i++;
    };

for(j=0;j<boundariesAr.length;){
    var serviceArea = "serviceArea" + j;
    var currentArray = boundariesAr[j];
    var currentItem = currentArray.split(" ");

    serviceArea = new google.maps.Polygon({
        path:currentItem,
        geodesic:true,
        strokeColor:'#000',
        strokeOpacity:1.0,
        strokeWeight:2,
        fillColor: '#FF0000',
        fillOpacity: 0.35
        });
    serviceArea.setMap(map);
    j++;
    };

编辑 - 更新的代码(仅一个代码段) 这是一个截断的数组外观:

var boundaries0 = [
new google.maps.LatLng(65.307997,-146.130689),
new google.maps.LatLng(65.291840,-146.198712),
];
var boundaries1 = [
new google.maps.LatLng(64.703884,-147.150958),
new google.maps.LatLng(64.703189,-147.155442),
];


var arrays = 50; //boundaries0[],boundaries1[], etc

var boundariesAr = new Array;

for(var i=0;i<arrays;i++){
    boundariesAr.push(boundaries);
    };
for(var j=0;j<boundariesAr.length;j++){
    var serviceArea = "serviceArea" + j;
    var currentArray = boundariesAr[j];
    var currentItem = currentArray.split(" ");

    serviceArea = new google.maps.Polygon({
        path:currentItem,
        geodesic:true,
        strokeColor:'#000',
        strokeOpacity:1.0,
        strokeWeight:2,
        fillColor: '#FF0000',
        fillOpacity: 0.35
        });
    serviceArea.setMap(map);
    };

感谢一些精力充沛的人,他们抽出时间来帮忙。如果可以的话,我会给你买饮料。

这最终起作用了 - (我觉得没有将数组嵌套开始就很愚蠢)

var boundaries = [];
boundaries[0] = [
new google.maps.LatLng(65.307997,-146.130689),
new google.maps.LatLng(65.291840,-146.198712),
];
boundaries[1] = [
new google.maps.LatLng(64.703884,-147.150958),
new google.maps.LatLng(64.703189,-147.155442),
];

var arrays = 50; //Set this to how many arrays are created.

for(var j=0;j<arrays;j++){

    serviceArea = new google.maps.Polygon({
        path:boundaries[j],
    geodesic:true,
    strokeColor:'#000',
    strokeOpacity:1.0,
    strokeWeight:2,
    fillColor: '#FF0000',
        fillOpacity: 0.35
    });
serviceArea.setMap(map);
};

4 个答案:

答案 0 :(得分:3)

boundariesAr.push('boundaries' + i)正在推动"boundaries"字符串连接以及循环中的i(您最终会得到50个字符串:{ {1}}到"boundaries0")。您应该更改此选项以推送您想要推送的实际"boundaries49"对象。哦,并确保将迭代变量声明为非全局变量(使用Array),以便var不是全局变量 - 这将非常糟糕。

i

在此之后,您似乎想在阵列上运行// V---------------here------------- for(var i = 0; i < arrays; i++){ // | boundariesAr.push(boundaries); // | //i++; /*no need for this, just put it in the for loop - */ }; ,这会让您感到悲伤。 split()用于字符串,因此您可以将字符串拆分为由传递给split()的任何字符分隔的数组。例如,split()将创建数组"Hello I am dog".split(" ")。但是你已经有了一个数组,所以除非你需要对该数组进行字符串操作,否则最好删除这一行。 (现在,无论如何,阵列似乎都是空的。)

另一个问题:您将["Hello", "I", "am", "dog"]设置为字符串,然后立即使用serviceArea覆盖它。如果您希望它是多边形,则不应该有理由使用serviceArea = new google.maps.Polygon({...})对其进行实例化。这样做会很好:var serviceArea = "serviceArea" + j;

答案 1 :(得分:2)

boundariesAr.push('boundaries' + i);

将元素(字符串)推入数组,而不是在第一个数组中放置另一个数组(正如我所想的那样)。

提供10x10阵列的直接示例:

var ary = []; // [] == new Array

for (var i = 0; i < 10; i++){
  ary[i] = []; // add a nested array (2D)
  for (var j = 0; j < 10; j++){
    // add a string within the nested array as an element
    ary[i].push('row' + i + ', col' + j);
  }
}

// debugging -- http://jsfiddle.net/Gv6kP/
console.log(JSON.stringify(ary));

答案 2 :(得分:2)

您的“更新代码”包含:boundariesAr.push(boundaries);但据我所知,boundariesundefined

如果你想要一个数组数组,不应该是这样的:

var boundaries = [
  [
    new google.maps.LatLng(65.307997,-146.130689),
    new google.maps.LatLng(65.291840,-146.198712)
  ],
  [
    new google.maps.LatLng(64.703884,-147.150958),
    new google.maps.LatLng(64.703189,-147.155442)
  ]
];

您也可以这种方式创建它(如果您更容易通过索引设置它们):

var boundaries = [];
boundaries[0] = [
  'map thing',
  'map thing 2'
]
boundaries[1] = [
  'more map things',
  'more map things 2',
]

这将使你在boundaries[0]时得到

[
  new google.maps.LatLng(65.307997,-146.130689),
  new google.maps.LatLng(65.291840,-146.198712)
]

这当然使您能够boundaries[0][0]

使用new Array创建一个新数组似乎很愚蠢。只需使用var myThing = [];

即可

拥有实际多维数组后,您应该可以这样做:

for(var j=0;j<boundaries.length;j++){
  for( var b=0; b<boundaries[j].length;b++){
    currentItem = boundaries[j][b];
    // At this point currentItem is `new google.maps.LatLng(65.307997,-146.130689)`
    var serviceArea = new google.maps.Polygon({
      path:currentItem,
      geodesic:true,
      strokeColor:'#000',
      strokeOpacity:1.0,
      strokeWeight:2,
      fillColor: '#FF0000',
      fillOpacity: 0.35
    });
  }
  serviceArea.setMap(map); // Where does `map` come from?
}

如果您的边界实际上是一大堆独立的数组boundaries1boundaries2 ... boundaries50,那么您需要将它们更改为更少(将它们放入数组中我在这里提到过),或者你不能做你想做的事。当你只将变量的名称作为字符串时,Javascript无法让我知道(而且我已经彻底查看过)从变量中检索值。

基本上,你不能按照"boundaries" + i;或类似的方式动态调用变量,除非你把它们放到一个合适的数组或对象数据中,否则就没有办法做到这一点结构

答案 3 :(得分:0)

这一行是你的问题:

boundariesAr.push('boundaries' + i);

您正在将字符串推入阵列。要推送数组,只需执行以下操作:

boundariesAr.push([]);

[]是数组文字的表示法。