【问题标题】:How to remove a value and key without affecting the original array? [duplicate]如何在不影响原始数组的情况下删除值和键? [复制]
【发布时间】:2019-10-02 11:03:35
【问题描述】:

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

如何改进我的代码,以便 downloadData 可以从 listData 复制数据并删除数组中的 id、createdBy、create_at、updatedBy 和 updated_at,但 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;
}

【问题讨论】:

    标签: javascript angular


    【解决方案1】:

    您应该使用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()

    您可以在原始数组上使用map() 并返回包含所需属性的新数组

    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),{})
    });
    

    【讨论】:

      【解决方案2】:

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

      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;
      }

      【讨论】:

        【解决方案3】:

        您必须复制原始数据。

        您可以通过多种方式做到这一点:

        // 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】:
           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;
          }
          

          你可以试试这个...使用扩展运算符你可以将数据传播到 downloadData 变量而不改变 listData

          【讨论】:

            【解决方案5】:

            你可以这样尝试使用"..."深拷贝

            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;
            }
            
            

            让我知道它是否有效。

            【讨论】:

              猜你喜欢
              • 2020-02-09
              • 2016-03-22
              • 2021-06-09
              • 2021-12-03
              • 2014-11-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多