给定对象:

var firstObject = {
    key1 : 'value1',
    key2 : 'value2'
};

我如何复制属性在另一个对象(secondObject)像这样:

var secondObject = {
    key1 : 'value1',
    key2 : 'value2',
    key3 : 'value3',
    key4 : 'value4'
};

使用对firstObject的引用?就像这样:

var secondObject = {
    firstObject,
    key3 : 'value3',
    key4 : 'value4'
};

(这行不通……我把它放在大行中只是为了显示我想如何组织代码)。

不使用任何JavaScript框架的解决方案是否可行?


遍历第一个对象的属性并将它们赋值给第二个对象,如下所示:

var firstObject = {
    key1 : 'value1',
    key2 : 'value2'
};

var secondObject = {
    key3 : 'value3',
    key4 : 'value4'
};

for (var prop in firstObject) {
    if (firstObject.hasOwnProperty(prop)) {
        secondObject[prop] = firstObject[prop];
    }
}

for-in循环是不够的;你需要hasOwnProperty。有关原因的详细解释,请参阅http://bonsaiden.github.com/JavaScript-Garden/#object.forinloop。


for(var k in firstObject) secondObject[k]=firstObject[k];

不幸的是,您不能像这样在对象中放置对变量的引用。但是,您可以创建一个函数,将对象的值复制到另一个对象。

function extend( obj1, obj2 ) {
    for ( var i in obj2 ) {
        obj1[i] = obj2[i];
    }
    return obj1;
}

var firstObject = {
    key1: "value1",
    key2: "value2"
};

var secondObject = extend({
    key3: "value3",
    key4: "value4"
}, firstObject );

这应该可以工作,在这里进行了测试。

var secondObject = {
    firstObject: JSON.parse(JSON.stringify(firstObject)),
    key3 : 'value3',
    key4 : 'value4'
};

注意:这不会复制firstObject的方法 注2:在旧的浏览器中使用,你需要一个json解析器 注3:通过引用赋值是一个可行的选项,特别是当firstObject包含方法时。相应地调整给定的jsfiddle示例


死灵,所以人们可以找到一个深度复制方法与hasOwnProperty和实际对象检查:

var extend = function (original, context, key) {
  for (key in context)
    if (context.hasOwnProperty(key))
      if (Object.prototype.toString.call(context[key]) === '[object Object]')
        original[key] = extend(original[key] || {}, context[key]);
      else
        original[key] = context[key];
  return original;
};

在这里玩死灵法师,因为ES5带来了Object.keys(),有可能将我们从所有这些. hasownproperty()检查中拯救出来。

Object.keys(firstObject).forEach(function(key) {
  secondObject[key] = firstObject[key];
});

或者,将它包装成一个函数(lodash _.assign()的有限“拷贝”):

function assign(object, source) {
  Object.keys(source).forEach(function(key) {
    object[key] = source[key];
  });
}

assign(secondObject, firstObject); // assign firstObject properties to secondObject

Object.keys()是一个相对较新的方法,最值得注意的是:在IE < 9中不可用。同样的情况也适用于. foreach()数组方法,我用它来代替常规的for循环。

幸运的是,这些古老的浏览器有ES5 -shim可用,它将填充许多ES5特性(包括这两个)。

(我完全支持填充程序,而不是拒绝使用很酷的新语言特性。)


从@ bardzuievny的回答中得到启发,ES6提供了一个本地解决方案:Object.assign()函数!

用法很简单:

Object.assign(secondObject, firstObject);

就是这样!

目前的支持显然很差;只有Firefox(34+)可以开箱即用,而Chrome(45+)和Opera(32+)需要设置“实验性标志”。

支持正在改进,最新版本的Chrome、Firefox、Opera、Safari和Edge都支持它(显然IE不支持)。转译器也可用,如Babel和Traceur。请看这里了解更多细节。


我宁愿使用firstObject作为secondObject的原型,并添加属性描述符:

var secondObject = Object.create(firstObject, {
      key3: {value: "value3", writable: true, configurable: true, enumerable: true},
      key4: {value: "value4", writable: true, configurable: true, enumerable: true}
      });

它当然不是一行程序,但它给了您更多的控制。如果您对属性描述符感兴趣,我建议阅读这篇文章:http://patrickdelancy.com/2012/09/property-descriptors-in-javascript/#comment-2062 和MDN页面https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

你也可以只分配值,省略描述符,让它更短:

var secondObject = Object.create(firstObject, {
      key3: {value: "value3"}
      key4: {value: "value4"}
  });

兼容性:ECMAScript 5,即IE9+


根据ES6 -扩展语法:

你可以简单地使用:

const thirdObject = {
   ...firstObject,
   ...secondObject   
}

这避免了通过引用传递这些对象的问题。

此外,它还负责具有深度嵌套的对象。


如果您只想获取第二个对象中存在的属性,则可以使用object。键要获取第一个对象的属性,可以做两个方法:

A.) map使用副作用将第一个对象的属性分配给第二个对象:

var a = {a:100, b:9000, c:300};
var b = {b:-1};

Object.keys(a).map(function(key, index) {
    if (typeof b[key] !== 'undefined') {
        console.log(key);
        b[key] = a[key];    
    }
});

B.)或reduce来创建一个新对象并将其分配给第二个对象。注意,这个方法替换了第二个对象之前不匹配第一个对象的其他属性:

var a = {a:100, b:9000, c:300};
var b = {b:-1, d:-1}; // d will be gone

b = Object.keys(a).reduce(function(result, current) {
    if (typeof b[current] !== 'undefined') {
        result[current] = a[current];   
    }
    return result;
}, {});

我们可以使用Object。赋值组合对象。它将从右向左组合并覆盖公共属性,即左边的相同属性将被右边覆盖。

重要的是在第一个对象中提供一个空对象,以避免改变源对象。源对象应该保持干净,因为object. assign()本身返回一个新对象。

希望这能有所帮助!

var firstObject = { Key1: 'value1', Key2: 'value2' }; var secondObject = { Key3: 'value3', Key4: 'value4' }; var finalObject =对象。assign({}, firstObject, secondObject) console.log (finalObject)


改进kingPuppy的想法和OP的想法(浅拷贝)-我只在OP的“例子”上加了3点:)

var secondObject = {
    ...firstObject,
    key3 : 'value3',
    key4 : 'value4'
};

var firstObject = { Key1: 'value1', Key2: 'value2' }; var secondObject = { firstObject, Key3: 'value3', Key4: 'value4' }; console.log (secondObject);


var firstObject = {
     key1: "value1",
     key2: "value2"
};

var secondObject = {
     key3: "value3",
     key4: "value4"
     copy: function(firstObject){
           this.key1 = firstObject.key1;
           this.key2 = firstObject.key2;
     }
 };

使用以下方法将复制属性

secondObject.copy(firstObject)

我对javascript很陌生,但发现这个工作。我想时间有点长了,但很管用。


使用属性扩展符号。它是在ES2018中添加的(数组/可迭代对象的扩展是更早的ES2015), {…firstObject}将所有可枚举的属性展开为离散的属性。

let secondObject = {
      ...firstObject,
      key3 : 'value3',
      key4 : 'value4'
    }

声明一下,现在也可以用

var firstObject = {
    key1 : 'value1',
    key2 : 'value2'
};

var secondObject = {
    ...firstObject,
    key3 : 'value3',
    key4 : 'value4'
};

对象。赋值或析构可能会给您带来很大的麻烦,因为只有顶级属性被复制为值。

所有嵌套的属性都将被复制为引用,并保留对原始对象属性的引用。如果你的物体是平的,那是可以的。但如果不是,这些方法很少适用。

对于最简单有效的一行程序,我会推荐deepmerge包,它没有这个缺点。

const newObject = deepmerge({}, oldObjectWithNestedProperties);

这将给你oldObjectWithNestedProperties的完全分离和独立的newObject副本。