JavaScript:数组与对象数组

时间:2017-04-07 19:38:03

标签: javascript arrays

我遇到的问题是,我正在运行的函数可以正常使用一个数组而不是全部使用另一个数组。

它们是以不同的方式创建的,并且根据我在控制台中看到的内容显然不同,但我无法弄清楚它们之间的区别。有人能指出我正确的方向吗?很抱歉,如果这是JavaScript 101.下面是每个阵列定义的屏幕截图,然后是我的控制台的快照。

var working = [
        {lat: -31.563910, lng: 147.154312},
        {lat: -33.718234, lng: 150.363181},
        {lat: -33.727111, lng: 150.371124},
        {lat: -33.848588, lng: 151.209834},
        {lat: -33.851702, lng: 151.216968},
        {lat: -34.671264, lng: 150.863657},
        {lat: -35.304724, lng: 148.662905},
        {lat: -36.817685, lng: 175.699196},
        {lat: -36.828611, lng: 175.790222},
        {lat: -37.750000, lng: 145.116667},
        {lat: -37.759859, lng: 145.128708},
        {lat: -37.765015, lng: 145.133858},
        {lat: -37.770104, lng: 145.143299},
        {lat: -37.773700, lng: 145.145187},
        {lat: -37.774785, lng: 145.137978},
        {lat: -37.819616, lng: 144.968119},
        {lat: -38.330766, lng: 144.695692},
        {lat: -39.927193, lng: 175.053218},
        {lat: -41.330162, lng: 174.865694},
        {lat: -42.734358, lng: 147.439506},
        {lat: -42.734358, lng: 147.501315},
        {lat: -42.735258, lng: 147.438000},
        {lat: -43.999792, lng: 170.463352}
      ]

var notWorking= [];
            var xml = data.responseXML;
            var markers = xml.documentElement.getElementsByTagName('marker');
            Array.prototype.forEach.call(markers, function(markerElem) {
                var latlng ={lat: parseFloat(markerElem.getAttribute('lat')),
                            lng: parseFloat(markerElem.getAttribute('lng'))};
            notWorking.push(latlng);

ScreenshotOfConsole

4 个答案:

答案 0 :(得分:1)

检查data.responseXML的格式是否应该

以下是一个有效的示例代码,它与您的代码相同,只是XML文档是从字符串加载的:

var working = [
        {lat: -31.563910, lng: 147.154312},
        {lat: -33.718234, lng: 150.363181},
        {lat: -33.727111, lng: 150.371124},
        {lat: -33.848588, lng: 151.209834},
        {lat: -33.851702, lng: 151.216968},
        {lat: -34.671264, lng: 150.863657},
        {lat: -35.304724, lng: 148.662905},
        {lat: -36.817685, lng: 175.699196},
        {lat: -36.828611, lng: 175.790222},
        {lat: -37.750000, lng: 145.116667},
        {lat: -37.759859, lng: 145.128708},
        {lat: -37.765015, lng: 145.133858},
        {lat: -37.770104, lng: 145.143299},
        {lat: -37.773700, lng: 145.145187},
        {lat: -37.774785, lng: 145.137978},
        {lat: -37.819616, lng: 144.968119},
        {lat: -38.330766, lng: 144.695692},
        {lat: -39.927193, lng: 175.053218},
        {lat: -41.330162, lng: 174.865694},
        {lat: -42.734358, lng: 147.439506},
        {lat: -42.734358, lng: 147.501315},
        {lat: -42.735258, lng: 147.438000},
        {lat: -43.999792, lng: 170.463352}
      ]

var notWorking= [];
var xmlString = '<markers><marker lat="-31.563910" lng="147.154312"></marker><marker lat="-31.563910" lng="147.154312"></marker></markers>';
var parser = new DOMParser();
var xml = parser.parseFromString(xmlString, "text/xml"); //important to use "text/xml"
var markers = xml.documentElement.getElementsByTagName('marker');
Array.prototype.forEach.call(markers, function(markerElem) {
     var latlng ={lat: parseFloat(markerElem.getAttribute('lat')),
                  lng: parseFloat(markerElem.getAttribute('lng'))};
	notWorking.push(latlng);
});

console.log(notWorking)

如果你没有发现你的xml有什么问题,请编辑你的答案并以这种方式粘贴data.responseXml

var oSerializer = new XMLSerializer();
var sXML = oSerializer.serializeToString(data.responseXML);
console.log(sXML)

答案 1 :(得分:0)

notWorking阵列上调用控制台日志时,它是空的!所以这可能是在数组被异步函数填充之前使用数组的问题。展开已记录的数组时,会有一条注释表明数组的值刚刚被评估过:

enter image description here

这意味着在展开数组的日志时,控制台会在此时获取数组的值(这可能是在数组填充了值之后)。在展开之前的空日志([])证明了当日志发生时,数组为空的假设。

查看代码,它看起来像XMLHttpRequest(异步)。如果你想使用数组的值,你必须在请求的回调中使用它,在请求的成功事件监听器的回调中,确保数组被填充!

答案 2 :(得分:0)

如果您正在使用数组:

var working = [
        {lat: -31.563910, lng: 147.154312}];

然后你需要展平你的数组,使其看起来像你的工作数组:

var arr = [{lat: -31.563910, lng: 147.154312}];
var arrayOfObj = [];
arrayOfObj.push(arr);

console.log(arr);

var flattenArr  =  arrayOfObj.reduce(function(prev, curr) {
  return prev.concat(curr);
});

console.log(JSON.stringify(flattenArr));

&#13;
&#13;
var arr = [{lat: -31.563910, lng: 147.154312}];
var arrayOfObj = [];
arrayOfObj.push(arr);

console.log(arrayOfObj);

var flattenArr  =  arrayOfObj.reduce(function(prev, curr) {
  return prev.concat(curr);
});

console.log(JSON.stringify(flattenArr));
&#13;
&#13;
&#13;

答案 3 :(得分:-1)

您发布的代码无效。该功能未关闭。我想您忘记复制记录变量的部分。

我要猜测你对你在控制台中看到的内容感到困惑,因为它会显示一个空数组,但随后会显示数据。发生的事情是,数据在记录时仍然是空的,然后填充,然后打开它并查看数据。只有在呈现值时,控制台才会更新其内容。