我正在做一个 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);
}
拼接发生在函数而不是类的根中,它必须是全局变量的问题吗?
最快的方法是 lodash cloneDeep 函数。
这是不同方法的基准。
发生这种情况是因为当您将新对象或数组设置为等于现有数组时 JS 中的引用,它不会创建一个新对象或数组,它只会引用现有数组,因此要创建一个新数组,有几种方法.. ES6 上的其中一个是使用 spread 运算符
let dt = [...this.detailsOriginal];
这对我有用。
const dt = JSON.parse(JSON.stringify(this.detailsOriginal));
从这里 : https://stackoverflow.com/a/23481096/4770754
我可以在我的函数中对我的常量进行不可挽回的更改感到满意,我只是不希望原始数组被触及。
问题是它是一个对象数组,对象副本只是指针和指针,除非你使用 JsonStringify。
这是对象的错。