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);
检查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)
我已经添加了关于如何序列化您的xml文档的示例代码 –
您发布的代码是无效的。该功能未关闭。我想你忘了复制记录变量的部分。
我会猜测你对控制台中看到的内容感到困惑,因为它向你展示了一个空数组,但是其中有数据。发生什么事是数组在记录时仍然是空的,然后它被填充,然后打开它并查看数据。只有在渲染时,控制台才会在值更改时更新其内容。
如果工作数组:
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));
您在哪里可以得到这个想法,该阵列没有变平? –
这些阵列似乎我也一样。这两个对象的数组。每个对象都有lat和lng属性。 – yBrodsky
你可以发布一个[小提琴](https://jsfiddle.net)显示该问题? – Adrian
我认为你需要压扁你的阵列! – funcoding