Object.assign删除现有属性

时间:2017-12-13 11:25:23

标签: javascript

我可能会误解Object.assign()的工作原理,但我并不认为它会移除现有的属性,例如:

var o1 = { "status":"", "app":{"version":"1.3.1.91","latest_version":"1.3.1.91"} }
var o2 = { "status":"listening", "app":{"latest_version":"1.3.2.879"} }

console.log(Object.assign({}, o1, o2));

输出:{"status":"listening","app":{"latest_version":"1.3.2.879"}}

我的期望是:{"status":"listening", "app":{"version":"1.3.1.91", "latest_version":"1.3.2.879"}}

我想这是因为它是一个嵌套对象?有没有让它自动更新嵌套对象(即,不必指定哪些)没有任何库?

谢谢

6 个答案:

答案 0 :(得分:1)

Object.assign无法管理嵌套对象。您必须遍历对象的属性。

以下代码管理您的案例,但如果您想使用更多嵌套对象,请以递归方式执行此操作

var o1 = { "status":"", "app":{"version":"1.3.1.91","latest_version":"1.3.1.91"} };
var o2 = { "status":"listening", "app":{"latest_version":"1.3.2.879"} };

var output = {};
Object.keys(o2).forEach(key => {
    if (o2[key] instanceof Object) {
        output[key] = Object.assign({}, o1[key], o2[key]);
    } else {
        output[key] = o2[key];
    }
});

console.log(output);

答案 1 :(得分:1)

  

目标对象中的属性将被源中的属性覆盖(如果它们具有相同的键)。后来的消息来源'属性将类似地覆盖先前的属性。

     

Object.assign()方法仅将可枚举和自己的属性从源对象复制到目标对象。它在源上使用[[Get]],在目标上使用[[Set]],因此它将调用getter和setter。因此,它分配属性而不仅仅是复制或定义新属性。

陈述MDN。如果您要使用jQuery,可以通过$.extend()完成此任务(在api.jquery.com上阅读更多内容):否则,您很可能会写出像@ Faly的答案。< / p>

&#13;
&#13;
var o1 = { "status":"", "app":{"version":"1.3.1.91","latest_version":"1.3.1.91"} }
var o2 = { "status":"listening", "app":{"latest_version":"1.3.2.879"} }

console.log($.extend(true, {}, o1, o2));
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

答案 2 :(得分:1)

var o1 = { a: 1, b: 1, c: 1 };
var o2 = { b: 2, c: 2 };
var o3 = { c: 3 };

var obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }

如果稍后出现的对象具有相同的属性,Object.assign将覆盖属性。在您的情况下,o2属性正在覆盖o1属性。我不认为有一种方法可以使用Object.assign实现您想要的效果。

答案 3 :(得分:0)

使用Object.assign,对象具有相同的键替换为最后一个对象:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

    var o1 = { status:"", app:{"version":"1.3.1.91","latest_version":"1.3.1.91"}};
    var o2 = { status:"listening", app:{"latest_version":"1.3.2.879"} };
    var {app: appo2} = o2
    var {app: appo1} = o1

    const result = {
      ...o2,
      app: {
        ...appo1,
        ...appo2
      }
    }
    console.log(result);

答案 4 :(得分:0)

另一个选项可以是嵌套分配:

var o1 = { status: ""         , app: { "version":"1.3.1.91", "latest_version":"1.3.1.91"  } }
var o2 = { status: "listening", app: {                       "latest_version":"1.3.2.879" } }

var o3 = Object.assign({}, o1, o2, { app: Object.assign(o1.app, o2.app) } ) 

var o4 = { ...o1, ...o2, app: { ...o1.app, ...o2.app } }

console.log( JSON.stringify(o3) )
console.log( JSON.stringify(o4) )

答案 5 :(得分:0)

您可以使用lodash中的merge:

https://lodash.com/docs/4.17.15#merge

它执行与分配相同的操作,但是在对象的每个级别上。请注意,它不会返回新对象。