Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript深度复制包含嵌套对象、数组和函数的数组?_Javascript_Arrays_Json_Copy_Deep Copy - Fatal编程技术网

JavaScript深度复制包含嵌套对象、数组和函数的数组?

JavaScript深度复制包含嵌套对象、数组和函数的数组?,javascript,arrays,json,copy,deep-copy,Javascript,Arrays,Json,Copy,Deep Copy,我有一个这样结构的数组,我正试图得到它的一个副本来修改并用于React setState。在Python中,我可以使用copy.deepcopy,但在JavaScript中找不到一种简单的方法来实现这一点 notes=[ { contents: "Hello World 1", function: console.log, children: [ { contents:

我有一个这样结构的数组,我正试图得到它的一个副本来修改并用于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上找到了这篇文章和类似的解决方案,但没有一个适合我。 两个解决方案只是一个浅拷贝,JSON.parse在函数上不起作用

我希望有一个函数可以深度复制包含任意嵌套JavaScript数据类型结构的任何数组或对象


我不想重新发明轮子,编写一个复杂的递归函数来遍历和克隆所有内容,是否有任何现有的解决方案?

编辑-您可以使用下面的解决方案,也可以导入Lodash并使用此解决方案

我用我找到的解决方案来回答我自己的问题。有人在我链接的文章的评论部分发布了这篇文章,它似乎起了作用

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

编辑-您可以使用下面的解决方案,也可以只导入Lodash并使用此解决方案

我用我找到的解决方案来回答我自己的问题。有人在我链接的文章的评论部分发布了这篇文章,它似乎起了作用

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


最短路径,如果你找不到更好的答案

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


中,您应该使用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; 
}

您应该使用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; 
}

请看下面我的答案。。。单线解决方案。。。const copy=notes.mapa=>{…a}@hev1不克隆功能是什么意思?这对我很有用,请看下面我的答案。。。单线解决方案。。。const copy=notes.mapa=>{…a}@hev1不克隆功能是什么意思?它对我有用