JavaScript:数组与对象数组

JavaScript:数组与对象数组

问题描述:

我遇到了一个问题,我正在运行的函数对一个数组工作正常,而不是全部都与另一个数组一起工作。JavaScript:数组与对象数组

他们正在以不同的方式创建,并且基于我在控制台中看到的显然不同,但我无法弄清楚其中的差异。有人能指引我朝着正确的方向吗?对不起,如果这是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

+0

这些阵列似乎我也一样。这两个对象的数组。每个对象都有lat和lng属性。 – yBrodsky

+0

你可以发布一个[小提琴](https://jsfiddle.net)显示该问题? – Adrian

+0

我认为你需要压扁你的阵列! – funcoding

检查data.responseXML格式化它应该

下面的方法是一个示例代码的作品,这是因为你除了XML文档从一个String加载相同的代码:

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'))}; 
 
\t notWorking.push(latlng); 
 
}); 
 

 
console.log(notWorking)

如果你没有发现有什么不对您的XML,请编辑你的答案并粘贴data.responseXml这样:

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

我已经添加了关于如何序列化您的xml文档的示例代码 –

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

我会猜测你对控制台中看到的内容感到困惑,因为它向你展示了一个空数组,但是其中有数据。发生什么事是数组在记录时仍然是空的,然后它被填充,然后打开它并查看数据。只有在渲染时,控制台才会在值更改时更新其内容。

当在notWorking阵列上调用控制台日志时,它是空的!所以这可能是在数组被异步函数填充之前使用数组的一个问题。当您打开记录的阵列,有一个规定,数组的值刚被评估记:

enter image description here

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

看看你的代码,它看起来像一个XMLHttpRequest(异步)。如果要使用数组的值,则必须在请求的成功事件侦听器的回调中的请求回调中使用它,以确保数组已填充!

如果工作数组:

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)); 

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));

+0

您在哪里可以得到这个想法,该阵列没有变平? –