通过引用克隆对象的属性

时间:2014-12-06 00:47:34

标签: javascript jquery angularjs pass-by-reference

我的数据对象:

var data = {
  foo: {
    bar: 42
  },
  baz: true,
  x: 1,
  y: 2
};

现在我想将此对象作为JSON字符串发送。 在发送之前,我想修改我的对象仍保留原始对象。

var json = data;
json.foo = json.foo.bar;
json.id = json.baz;
delete json.baz;

当然这也会修改我的data对象。

是否可以创建第二个对象,其结构与第一个对象相同,允许重命名/删除某些属性而不用更改第一个对象?

我知道我可以这样做:

var json = {
  foo: data.foo.bar,
  id: data.baz,
  x: data.x,
  y: data.y
};

但是假设data对象包含50个属性,我只想更改其中两个属性。

由于性能原因,我不想使用jQuery.copyangular.copy(他们会创建真实副本 - 这不应该是必要的)

也许有这样的事情?

var json = {
  foo: data.foo.bar,
  id: data.baz
};
json = merge(json, data);
delete json.baz;

谢谢! :)

1 个答案:

答案 0 :(得分:2)

您可以使用angular.extend()jQuery.extend()仅复制原始对象自己的属性。即浅拷贝

var json = angular.extend({}, data);
json.foo = data.foo.bar;
json.id = data.baz;
delete json.baz;

var json = angular.extend({}, data, {
  foo: data.foo.bar,
  id: data.baz
});
delete json.baz;

请注意,以下内容无法发挥作用,因为data foo将覆盖第一个参数对象的foo

var json = angular.extend({
  foo: data.foo.bar,
  id: data.baz
}, data);
delete json.baz;