当我移动tempArr时,async.eachSeries实际上会跳过坐标(或者看起来CoordinArr也会被移位)。我认为它与指向具有相同内存位置的对象的指针有关,但我不知道它是如何工作的。将值赋给变量时实际发生了什么?
如果我
,代码将有效
tempArr = _.toArray(coordinates);
而不是
tempArr = coordinatesArr;
以下示例:
var coordinatesArr, tempArr;
var marginLon = [];
var marginLat = [];
var coordinates = {
'0': { lon: 13.18472, lat: 32.88972 },
'1': { lon: 13.400454, lat: 32.767144 },
'2': { lon: -120.59234, lat: 47.372269 },
'3': { lon: 122.065977, lat: -26.471618 },
'4': { lon: 122, lat: -25 }
}
coordinatesArr = _.toArray(coordinates);
tempArr = coordinatesArr;
// Will work if changed to below
// tempArr = _.toArray(coordinates);
async.eachSeries(coordinatesArr, function(set, acb) {
tempArr.shift();
if(tempArr.length < 1) return acb();
async.eachSeries(tempArr, function(set2, aacb) {
marginLon.push(Math.abs(set.lon - set2.lon));
marginLat.push(Math.abs(set.lat - set2.lat));
aacb();
}, function(err) {
if(err) return acb();
acb();
});
}, function(err) {
if(err) return;
return;
});
谢谢
答案 0 :(得分:0)
所有变量最终只能包含标量(非复合)值。然而,这些值中的一些仅仅是引用对象(例如,指向对象或数组的指针)。您必须识别何时需要可以在保留原件的同时修改的数据副本。
第一个问题为什么不从数组开始?
var coordinatesArr = [
{ lon: 13.18472, lat: 32.88972 },
{ lon: 13.400454, lat: 32.767144 } // etcetera
]
其次,shift是一种破坏性操作,如果tempArr和coordinatesArr都指向同一个物理数组,修改一个就会修改它们。
你需要像下面的一行来创建一个不会损害原始数据的可修改数组:
var tempArr = coordinatesArr.slice();