数组vectX与esaminatori意外联动,值同步变更问题求助
数组联动异常问题排查与解决
问题代码与场景
编写表格脚本时遇到数组互相镜像变更的异常,核心代码如下:
var vectX = []; var esaminatori = []; ... (code omitted) vectX = ws.getRange(5, 10, 5, 3).getValues(); for (i = 0; i < 5; i++) { if (vectX[i][0] != "") { numEsaminatori ++; esaminatori[numEsaminatori-1] = vectX[i]; }; }; ... (code omitted) for (ii = 0; ii < 5; ii ++) { vectX[ii][3] = " "; for (i = 0; i < numEsaminatori; i ++) { if (vectX[ii][0] === esaminatori[i][0]) { vectX[ii][3] = esaminatori[i][3]; i = 6; }; }; }; ws.getRange(5, 10, 5, 4).setValues(vectX);
测试场景
- vectX从表格读取5行3列数据,将非空行存入esaminatori数组
- 测试时vectX第0、1、3行有值,esaminatori对应存储这三行数据
- 修改esaminatori数组的列时,vectX对应位置自动同步变更;初始化vectX的列时,esaminatori对应行内容也被修改丢失
问题原因
这是JavaScript引用类型的特性导致的:数组属于引用类型,你直接将vectX[i]赋值给esaminatori元素时,并没有复制行数据的内容,而是把vectX对应行的内存引用传给了esaminatori。此时esaminatori里的元素和vectX的对应行指向同一个数组对象,修改其中一个,另一个必然同步变化。
解决方法
给esaminatori存入原数组的副本,切断引用关联。修改赋值逻辑为:
// 方法1:使用扩展运算符复制行数组 esaminatori[numEsaminatori-1] = [...vectX[i]]; // 方法2:使用slice()方法创建副本 // esaminatori[numEsaminatori-1] = vectX[i].slice();
这样esaminatori里存储的是独立的数组副本,和vectX的行不再共享引用,后续修改任意一个数组都不会影响另一个。
内容的提问来源于stack exchange,提问作者LUCA DELLA GHEZZA
相关产品推荐
相关产品推荐

