【问题标题】:Data pointers? Shifting one array seems to affect another数据指针?移动一个数组似乎会影响另一个数组
【发布时间】:2018-04-05 23:50:23
【问题描述】:

当我移动 tempArr 时,async.eachSeries 实际上会跳过坐标(或者看起来像坐标Arr 也被移动了)。我认为这与指向具有相同内存位置的对象的指针有关,但我不知道它是如何工作的。当我为变量赋值时实际发生了什么?

如果我这样做,代码将起作用

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

谢谢

【问题讨论】:

  • 什么是_.toArray()?拨打.shift()的目的是什么?
  • _.toArray() 来自将对象转换为数组的 lodash 库。我想要做的是一个异步嵌套的 for 循环。移位的目的是让我不比较相同的坐标(即坐标[0] 和坐标[0]。

标签: javascript arrays pointers memory async.js


【解决方案1】:

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

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

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

其次,移位是一种破坏性操作,如果 tempArr 和 coordinateArr 都指向同一个物理数组,修改一个会修改两者。

您需要类似于下面的行来创建一个不会损害原始数组的可修改数组:

var tempArr = coordinatesArr.slice();

【讨论】:

  • 1.我从一个更大的脚本中提取了这一部分。这是我点击第三方 api 时得到的响应。 2. 我想我现在明白了,所以当我声明一个变量时,我实际上只是在创建指向内存中位置的指针,除非正在创建该对象。通过 var tempArr = coordinatesArr.slice(); 我现在内存中有 2 个数组吗?
  • 是的,您现在有两个数组。一个您可以依赖它作为您开始时的记录,直到您不再需要它,另一个可以缩小或修改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 2012-04-13
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 2017-08-23
相关资源
最近更新 更多