我正在开发一个Angular 5项目,我似乎无法获得不是内存指针的数组副本。或者说我可以,但有时候。在我看来,为什么一个人会工作而另一个人没有区别因素。
这里没有:
detailsOriginal = [
{title: 's ', value: 'sd' },
{title: 'yy : ', value: 'sdgf'},
{title: 'yyy: ', value: 'sdgsed'},
{title: 'hgjtgj : ', value: 'sqdgqsd'},
{title: 'dsfs: ', value: 'sqdg'},
{title: 'dsfds : ', value: 'sqdfgqds'},
{title: 'q : ', value: '1sqdfg'},
{title: 'qsdqsdqsd : ', value: 'sdqffgdsq'},
{title: 'qsdqsd: ', value: 'qdsf'},
{title: 'qs qsd: ', value: 'sqdqs'},
{title: 'qsd: ', value: '2'}
];
treatInfoArray(selection){
console.log(this.detailsOriginal); // correct output. unaltered
let dt = this.detailsOriginal.slice(); // this suposedly copies rather
// than creates a pointer...
setTimeout(()=>{
console.log('new var', dt); // correct output. unaltered
},1);
setTimeout(()=>{
dt.forEach(x => {
x.value = selection[x.value];
});
},20);
setTimeout(()=>{
console.log('modified', dt); // correct. modified.
},50);
setTimeout(()=>{
console.log('original', this.detailsOriginal);// why the hell is this also modified??
},55);
}
拼接是在一个函数而不是类的根中发生的问题,它必须是一个全局变量吗?
答案 0 :(得分:2)
最快的方法是执行lodash cloneDeep。
答案 1 :(得分:1)
这种情况正在发生,因为当你设置一个新的对象或数组等于一个现有的数组时,JS中的引用,它将不会创建一个新的,它将只引用现有的一个,所以创建一个新的数组有一个几种方法..其中一个在ES6上使用spread operator
let dt = [...this.detailsOriginal];
答案 2 :(得分:0)
const dt = JSON.parse(JSON.stringify(this.detailsOriginal));
从这里开始:https://stackoverflow.com/a/23481096/4770754
我很好,我的const在我的功能中无可挽回地改变了,我只是不想触及原始阵列。
问题是除非你使用JsonStringify,否则对象数组和对象副本只是指针和指针。
这是对象的错。