代码之家  ›  专栏  ›  技术社区  ›  W Kenny

如何删除值和键而不影响原始数组[[副本]

  •  1
  • W Kenny  · 技术社区  · 7 年前

    当我运行下面的代码时,listData(原始数据源)也会受到影响。

    let downloadData = this.listData.filteredData;
    
    let downloadDataNum = downloadData.length;
    
    for( let i = 0; i < downloadDataNum; i++ ) {
      delete downloadData[i].id;
      delete downloadData[i].createdBy;
      delete downloadData[i].created_at;
      delete downloadData[i].updatedBy;
      delete downloadData[i].updated_at;
    }
    
    5 回复  |  直到 7 年前
        1
  •  2
  •   Yash Rami    7 年前

    "..." 深度复制

    let downloadData = [...this.listData.filteredData];
    
    let downloadDataNum = downloadData.length;
    
    for( let i = 0; i < downloadDataNum; i++ ) {
      delete downloadData[i].id;
      delete downloadData[i].createdBy;
      delete downloadData[i].created_at;
      delete downloadData[i].updatedBy;
      delete downloadData[i].updated_at;
    }
    
    

    让我知道它是否有效。

        2
  •  2
  •   DAMMAK    7 年前
     let downloadData = [...this.listData.filteredData];
    
    for( let i = 0; i < downloadData.length; i++ ) {
      delete downloadData[i].id;
      delete downloadData[i].createdBy;
      delete downloadData[i].created_at;
      delete downloadData[i].updatedBy;
      delete downloadData[i].updated_at;
    }
    

    你可以试试这个。。。使用spread操作符,您可以将数据分散到downloadData变量,而无需改变listData

        3
  •  1
  •   Maxime Alejandro Meza    7 年前

    你必须复制原始数据。

    您可以通过以下几种方式实现:

    // Way 1
    let downloadData = Array.from(this.listData.filteredData);
    
    // Way 2
    let downloadData = JSON.parse(JSON.stringify(this.listData.filteredData));
    
    // Way 3 (using spread operator)
    let downloadData = [...this.listData.filteredData];
    
    // Way 4
    let downloadData = this.listData.filteredData.slice(0);
    

    downloadData 不会影响原始数据。

        4
  •  0
  •   Mosè Raguzzini    7 年前

    只需在编辑数组之前克隆它,因为数组是通过引用复制的:

    let downloadData = this.listData.filteredData;
    
    // Clone the array
    let cloneDownloadData = downloadData.slice(0);
    
    let downloadDataNum = cloneDownloadData.length;
    
    for( let i = 0; i < downloadDataNum; i++ ) {
      delete cloneDownloadData[i].id;
      delete cloneDownloadData[i].createdBy;
      delete cloneDownloadData[i].created_at;
      delete cloneDownloadData[i].updatedBy;
      delete dcloneDownloadData[i].updated_at;
    }
        5
  •  0
  •   Maheer Ali    7 年前

    您应该使用 JSON.stringify() JSON.parse()

    let downloadData = JSON.parse(JSON.stringify(this.listData.filteredData));
    

    此外,还可以使用键数组来简化代码 forEach

    let keys = ['id','createdBy','created_at','updatedBy','updated_at'];
    downloadDataNum.forEach(x => {
         keys.forEach(key => delete x[key]);
    })
    

    使用 map() 和 reduce()

    你可以用 地图() 并返回包含所需属性的新数组

    let keys = ['id','createdBy','created_at','updatedBy','updated_at'];
    let downloadData = this.listData.filteredData.map(x => {
         return keys.reduce((ac,a) => (ac[a] = x[a],ac),{})
    });