如果我在 JavaScript 中拼接克隆的数组,为什么我的原始数组会被拼接
Why does my original array get spliced if I splice the cloned array in JavaScript?
我有以下代码:
var coords = [
{lat: 39.57904, lng: -8.98094, type: "a"}, // A
{lat: 39.55436, lng: -8.95493, type: "b"}, // B
{lat: 39.56634, lng: -8.95836, type: "c"} // C
];
var travelingOptions = [];
getAllTravelingOptions();
function getAllTravelingOptions(){
coords.forEach((point, pos) => {
let c = coords;
delete c[pos];
console.log(c);
console.log(coords);
});
}
为什么变量c
和coords
总是相同的?如果我在c
上删除,它会镜像coords
上的操作。这是正常行为吗?
因为c
的赋值,你得到了数组coords
的引用。
任何coords
的更改都会影响c
,直到将新值分配给c
。
如果使用 Array.slice
创建数组的副本,则会得到一个新数组,但对象引用相同。更改内部的一个对象时,您将更改具有相同引用的同一对象 c
。
var coords = [
{lat: 39.57904, lng: -8.98094, type: "a"}, // A
{lat: 39.55436, lng: -8.95493, type: "b"}, // B
{lat: 39.56634, lng: -8.95836, type: "c"} // C
],
c = coords.slice();
console.log(c);
coords[1].type = 'foo';
console.log(c);
.as-console-wrapper { max-height: 100% !important; top: 0; }
赋值不会克隆数组,它只创建对原始对象/数组的引用。您可以使用 Array.prototype.slice(( 制作一个浅拷贝:
let c = coords.slice();
发生这种情况是因为c
和coords
现在引用同一个对象。若要防止出现这种情况,请使用 let c = coords.slice()
创建coords
的副本并将其分配给 c
。
let original = [1, 2, 3, 4];
let test = original;
let testSlice = original.slice();
original[0] = 12345;
console.log('test: ', test)
console.log('testSlice: ', testSlice)
但是,新数组仍将引用与旧数组相同的对象。对此的快速解决方法是"克隆"这些对象。
let objs = [
{'obj': 1},
{'obj': 2},
{'obj': 3}
];
let newArr = [];
objs.forEach(obj => {
let newObj = {};
Object.keys(obj).forEach(key => {
newObj[key] = obj[key];
});
newArr.push(newObj);
});
console.log('old: ', objs)
console.log('new: ', newArr)
newArr[0].obj = 12345;
console.log('old after changing obj on new: ', objs)
相关文章:
- 将数组的拼接分配给自身时,Javascript控制台打印不起作用
- 了解JS数组和拼接
- 尝试对对象数组进行排序但拼接不是一个函数
- Javascript拼接对象而不是数组
- Javascript拼接数组值
- 嵌套在 ng 重复中的拼接数组
- 在javascript中拼接一个复杂的多维数组
- 从数组Javascript中拼接对象
- 基于属性值的拼接数组
- 使用一个字符串数组来拼接另一个数组
- 如何在javascript中拼接数组中的项
- 拼接数组的Javascript只是替换值而不是删除它
- 为什么在 Javascript 中拼接数组中的对象不返回数组
- 拼接数组返回空的序列
- angular-如果src错误,则在指令内部拼接数组
- 从数据中拼接数组
- 添加或拼接数组的Javascript函数
- Javascript拼接数组
- 拼接数组/效果
- 拼接数组中剩余的最后一个空白