簡體   English   中英

JavaScript深度復制包含嵌套對象,數組和函數的數組?

[英]JavaScript deep copy an array containing nested objects, arrays & functions?

我有一個像這樣結構的數組,我試圖得到它的一個副本(修改並用於React setState())。 在Python中,我可以使用copy.deepcopy(),但是我找不到在JavaScript中執行此操作的簡便方法。

notes=[
        {
          contents: "Hello World 1",
          function: console.log,
          children: [
            {
              contents: "Hello World A",
              function: console.log,
              children: []
            },
          ]
        },
        {
          contents: "Hello World 2",
          function: console.log,
          children: []
        }
      ]

我在stackoverflow上找到了本文和類似的解決方案,但是它們都不適合我。 https://medium.com/@Farzad_YZ/3-ways-to-clone-objects-in-javascript-f752d148054d兩種解決方案只是淺表副本,而JSON.parse在功能上不起作用。

我想擁有一個可以深度復制任何包含嵌套JavaScript數據類型的任意結構的數組或對象的函數。

我寧願不浪費時間編寫復雜的遞歸函數來遍歷和克隆所有內容,是否有現有的解決方案?

編輯-您可以使用下面的解決方案,也可以只導入Lodash並使用此https://lodash.com/docs/#cloneDeep


我正在用找到的解決方案回答自己的問題。 有人在我鏈接的文章的評論部分中發布了此內容,它似乎有效

notes=[
        {
          contents: "Hello World 1",
          function: console.log,
          children: [
            {
              contents: "Hello World A",
              function: console.log,
              children: []
            },
          ]
        },
        {
          contents: "Hello World 2",
          function: console.log,
          children: []
        }
      ]

function deepCopy(src) {
  let target = Array.isArray(src) ? [] : {};
  for (let key in src) {
    let v = src[key];
    if (v) {
      if (typeof v === "object") {
        target[key] = deepCopy(v);
      } else {
        target[key] = v;
      }
    } else {
      target[key] = v;
    }
  }

  return target;
}

如果找不到更好的答案的最快捷方法

var note2 = JSON.parse(JSON.stringify(notes))

但是它沒有復制功能

所以檢查

function iterationCopy(src) {
  let target = {};
  for (let prop in src) {
    if (src.hasOwnProperty(prop)) {
      target[prop] = src[prop];
    }
  }
  return target;
}
const source = {a:1, b:2, c:3};
const target = iterationCopy(source);
console.log(target); // {a:1, b:2, c:3}
// Check if clones it and not changing it
source.a = 'a';
console.log(source.a); // 'a'
console.log(target.a); // 1

function bestCopyEver(src) {
  return Object.assign({}, src);
}
const source = {a:1, b:2, c:3};
const target = bestCopyEver(source);
console.log(target); // {a:1, b:2, c:3}
// Check if clones it and not changing it
source.a = 'a';
console.log(source.a); // 'a'
console.log(target.a); // 1

深度復制使用迭代

您應該使用for循環迭代它並判斷項目類型,當它是對象類型時,請使用遞歸。 函數像:

function copy(obj1, obj2) {
  var obj2=obj2||{}; 
  for(var name in obj1) {
    if(typeof obj1[name] === "object") { 
      obj2[name]= (obj1[name].constructor===Array)?[]:{}; 
      copy(obj1[name],obj2[name]);
     } else {
      obj2[name]=obj1[name]; 
   }
 }
  return obj2; 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM