数据指针?移动一个阵列似乎影响另一个阵列

时间:2017-10-25 02:43:05

标签: javascript arrays pointers memory async.js

当我移动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;
    });

谢谢

1 个答案:

答案 0 :(得分:0)

所有变量最终只能包含标量(非复合)值。然而,这些值中的一些仅仅是引用对象(例如,指向对象或数组的指针)。您必须识别何时需要可以在保留原件的同时修改的数据副本。

第一个问题为什么不从数组开始?

var coordinatesArr = [ 
  { lon: 13.18472, lat: 32.88972 },
  { lon: 13.400454, lat: 32.767144 } // etcetera
]

其次,shift是一种破坏性操作,如果tempArr和coordinatesArr都指向同一个物理数组,修改一个就会修改它们。

你需要像下面的一行来创建一个不会损害原始数据的可修改数组:

var tempArr = coordinatesArr.slice();