Object.assign删除已有属性

10

我可能误解了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个回答

5

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
目标对象中的属性将被源中具有相同键的属性覆盖。后面的源的属性也将覆盖先前的属性。
Object.assign() 方法只会从源对象复制可枚举且自身的属性到目标对象。它在源上使用[[Get]],在目标上使用[[Set]],因此它将调用 getters 和 setters。因此,它分配属性而不仅仅是复制或定义新属性。根据MDN所述。
如果您打算使用jQuery,这个任务可以通过$.extend()简单地完成(在api.jquery.com上阅读更多信息)。否则,您很可能会编写类似于@Faly答案的内容。

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));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


1
您可以使用lodash的合并功能:

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

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

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将覆盖这些属性。在您的情况下,o1的属性正在被o2的属性覆盖。我认为使用Object.assign无法实现您想要的结果。


0

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) )


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接