javascript - 使用扩展运算符深度合并对象
问题描述
我可以像这样合并多个对象:
var a = {k:{i:1, j:2}, m:6}
var b = {k:{i:3, l:4}}
var c = {
...a,
...b
}
c
有m:6
哪个好;但是, c 不包含k.j:2
. 那是因为...b
做了浅覆盖。
我想...
递归地使用,这样不在的嵌套属性b
就不会被覆盖。
我喜欢...
它,因为它看起来又快又干净。我可以在c
的对象初始化程序中这样做吗?
更新
到目前为止我已经接近了,但它似乎有点冗长:
var merge = (a,b) => Object.assign(a, ...Object.keys(b).map(k => ({[k]: typeof b[k] === 'object' ? merge(a[k], b[k]) : b[k]})))
var a = {k:{i:1, j:2}, m:6}
var b = {k:{i:3, l:4}}
var c = merge(a,b)
解决方案
这是不可能的...
。如果您事先知道对象的形状,尽管您可以这样写:
var a = {k:{i:1, j:2}, m:6}
var b = {k:{i:3, l:4}}
var c = {
...a,
...b,
k: { ...a.k, ...b.k },
}
否则,您需要编写一个函数来执行此操作或搜索一个:https ://www.npmjs.com/search?q=merge+deep
推荐阅读
- c - 为什么链表没有排序?
- xml - 引用属性中保存的数据时,XSLTForms 计算不起作用
- python - 错误:selenium.common.exceptions.TimeoutException:消息:
- javascript - 如何使用浏览器的 aws-sdk V3 (javascript) 跟踪上传到 S3 的进度
- css - 对齐内容中心不适用于我的列
- javascript - 第一首歌曲播放正常,但第二首歌曲在 discord.js 中没有错误
- swift - SwiftUI macOS 添加服装文件格式(UTI)
- c# - 如何使用c#对文本文件进行排序
- python - 在 Python 的 ast 中理解 ctx
- sql - 检查为空时 AND 语句的存储过程问题