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

时间:2018-03-13 12:40:04

标签: javascript arrays angular

我正在开发一个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);
}

拼接是在一个函数而不是类的根中发生的问题,它必须是一个全局变量吗?

3 个答案:

答案 0 :(得分:2)

最快的方法是执行lodash cloneDeep

Here is a benchmark of different methods.

答案 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,否则对象数组和对象副本只是指针和指针。

这是对象的错。