Javascript:复制数组的结果不稳定



我正在做一个 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。

这是对象的错。

最新更新