1. 程式人生 > >vue 爬坑 之js 物件/陣列 賦值/拷貝 解決VUE中賦值引用後資料雙向改變的問題

vue 爬坑 之js 物件/陣列 賦值/拷貝 解決VUE中賦值引用後資料雙向改變的問題

淺拷貝這裡就不講了,我們直接講深拷貝

正常的陣列/物件拷貝可以直接用

const cloneObj = JSON.parse(JSON.stringify(Obj));

這種方式可以解決相當多一部分的賦值問題,但是一些特殊屬性除外(undefined/function)

在vue 或者js 中有時需要對一些特殊資料處理,比如VUE中的table等…
這個時候就需要用到第二種方法處理資料

附程式碼:

/** 
  * 深拷貝  
  *  @param source Array/Object  物件/陣列
  */
util.deepClone = function (source){
  const targetObj = source.constructor === Array ? [] : {}; // 判斷複製的目標是陣列還是物件
  for(let keys in source){ // 遍歷目標
    if(source.hasOwnProperty(keys)){
      if(source[keys] && typeof source[keys] === 'object'){ // 如果值是物件,就遞迴一下
        targetObj[keys] = source[keys].constructor === Array ? [] : {};
        targetObj[keys] = util.deepClone(source[keys]);
      }else{ // 如果不是,就直接賦值
        targetObj[keys] = source[keys];
      }
    }
  }
  return targetObj;
};

我這裡是封裝在了工具類裡,單獨引用的小夥伴可自行把 util. 去掉.
這裡是通過遍歷賦值來處理資料的。

如果有更好的方法歡迎一起交流討論.