创建函数以将属性从一个对象复制到另一个对象

Create Function to Copy Properties From One Object to Another

提问人:mattdags 提问时间:3/15/2022 更新时间:3/15/2022 访问量:621

问:

我正在尝试创建一个函数,该函数将从源对象复制所有属性并将它们粘贴到目标对象。我想创建一个深层副本,所以我没有使用 object.assign()。

这是我的代码:

var obj1 = {
  arr: ['a','b','c','d'], // >= 4 elements, all should be truthy
  obj: {a:1,b:2,c:3,d:4}, // >= 4 values, all should be truthy
  halfTruthyArr: [null,'b',null,'d'], // >= 4 elements, half should be falsy
  halfTruthyObj: {a:1,b:null,c:3,d:null}, // >= 4 values, half should be falsy
  string: 'This is a string.',
  reverseString: function (string) {
    if (typeof string === 'string') return string.split('').reverse().join('');
  }
};

var obj2 = {}

function extend(destination, source) {
  destination = JSON.parse(JSON.stringify(source))
}

extend(obj2,obj1)

console.log(obj2)
  1. 使用该函数不会更改 obj2。我知道该函数使用通过引用传递,这就是不重新分配对象的原因。有没有办法解决这个问题,以便编辑我作为参数传入的对象?
  2. obj1 中的 reverseString 方法不会使用 JSON.stringify 进行复制。为什么会这样?
JavaScript JSON 对象 按引用传递

评论

1赞 Nick Bailey 3/15/2022
这回答了你的问题吗?如何深度合并而不是浅层合并?
0赞 Daniel Beck 3/15/2022
"undefined、s 和 s 不是有效的 JSON 值。如果在转换过程中遇到任何此类值,则它们要么被省略(在对象中找到时)要么更改为 null(在数组中找到时)“ developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...FunctionSymbol

答:

0赞 Serge 3/15/2022 #1

如果要在函数中设置对象或数组的值,则为“按值传递”。因此,您需要通过引用传递对象或尝试此操作

function extend(source) {
  return JSON.parse(JSON.stringify(source))
}

var obj2=extend(obj1);

console.log("ext",obj2)

或通过引用传递。在这种情况下,您只是更改对象内部的属性,而不是为整个对象分配新值


function extend(source, destination) {
  destination.result = JSON.parse(JSON.stringify(source));
}

var destination = { result: {} };

extend(obj1, destination);

var obj2=destination.result;

console.log("ext", obj2);