Javascript multidim数组错误

时间:2015-12-23 15:46:48

标签: javascript arrays multidimensional-array

我有一个这样的数组:

var ret = ["-37.8497", "144.968", "Albert Park Grand Prix Circuit", "2.76083", "101.738", "Sepang International Circuit","26.0325", "50.5106", "Bahrain International Circuit",...]

我希望它是这样的:

var markers = [
  {latLng: [45.616944, 9.2825], name: 'Italian Grand Prix'},
  {latLng: [52.0732605, -1.0166426], name: 'British Grand Prix'},
  {latLng: [43.7345, 7.4214], name: 'Monaco Grand Prix'},
  {latLng: [49.332, 8.58], name: 'German Grand Prix'}, ...]

我实现了这个功能:

var j=0;
for (i = 0; i < ret.length; i+=3)
{
  markers[j].latLng[0] = ret[i];
  markers[j].latLng[1] = ret[i+1];
  markers[j].name = ret[i+2];
  j++;
 }

我得到了这个错误:

Uncaught TypeError: Cannot read property '0' of undefined

在for。的第一行。

我用Google搜索了一段时间,但似乎javascript并没有真正支持多个数组。你能帮我正确实施吗?

2 个答案:

答案 0 :(得分:1)

您必须手动创建对象。这是一种可行的方法:

var markers = [];
for (var i = 0; i < ret.length; i+=3) {
  markers.push({
    latLng: [ret[i], ret[i+1]],
    name: ret[i+2]
  });
}

在这里,我删除了j变量,将其换成push;这种方式似乎更简洁,更易读。

至于错误 - 请参阅,JavaScript中没有自动生存这样的东西。这个表达......

markers[j].latLng[0]

...以这种方式处理:

  • 首先,JS尝试找到markers变量的值,
  • 然后它尝试获取该值的属性,该属性的名称等于j(循环的第一步为0)
  • 然后它尝试获取上一步找到的值的latLng属性
  • 最后,此值的0属性填充了ret[i]值。

显然,如果这些步骤中的任何一个导致undefined,则后续尝试查询undefined的任何属性都会导致错误。

答案 1 :(得分:0)

您需要进行两项小改动:

&#13;
&#13;
var ret = ["-37.8497", "144.968", "Albert Park Grand Prix Circuit", "2.76083", "101.738", "Sepang International Circuit", "26.0325", "50.5106", "Bahrain International Circuit"],
    markers = [],
    i, j = 0;

for (i = 0; i < ret.length; i += 3) {
    markers[j] = {};                // add this for a new object
    markers[j].latLng = [];         // add this for a new array
    markers[j].latLng[0] = ret[i];
    markers[j].latLng[1] = ret[i + 1];
    markers[j].name = ret[i + 2];
    j++;
}

document.write('<pre>' + JSON.stringify(markers, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

或者在一行中:

&#13;
&#13;
var ret = ["-37.8497", "144.968", "Albert Park Grand Prix Circuit", "2.76083", "101.738", "Sepang International Circuit", "26.0325", "50.5106", "Bahrain International Circuit"],
    markers = [],
    i;

for (i = 0; i < ret.length; i += 3) {
    markers.push({ latLng: [ret[i], ret[i + 1]], name: ret[i + 2] });
}

document.write('<pre>' + JSON.stringify(markers, 0, 4) + '</pre>');
&#13;
&#13;
&#13;