我正在努力合并 2 个对象。它们都有嵌套对象,任意键的值可以是空字符串。
const obj1 = { name: "Arthur", lastName: "King", address: {
street: "",
city: "Some city",
zip: "26772",
}};
const obj2 = { name: "", lastName: "", address: {
street: "Some street",
city: "",
zip: "",
}};
Object.assign
和 spread operator 不工作,因为它们正在进行浅合并,这不是我的情况,即使我单独合并嵌套对象也是如此。
问题在于,合并 2 个具有空字符串值的对象无法按预期工作,因为 Javascript 将空字符串视为不同于 undefined
或 null
的值。
const merged = {...obj1, ...obj2, address: {...obj1.address, ...obj2.address}}
The result will be
{
"name": "",
"lastName": "",
"address": {
"street": "Some street",
"city": "",
"zip": ""
}
}
期望的结果可能是下面的结果,但不知何故它不会忽略空值并将它们视为值。
{
"name": "",
"lastName": "",
"address": {
"street": "Some street",
"city": "Some city",
"zip": "26772"
}
}
解决方法之一是从对象中删除所有空字符串值,然后进行合并,但恕我直言,这完全是矫枉过正。
最佳答案
您可以通过获取条目并检查值是否为对象来创建一个新对象,然后将合并的嵌套对象作为值。
此方法仅适用于相同的对象结构。
const
merge = (a, b) => Object.fromEntries(Object
.entries(a)
.map(([k, v]) => [k, v && typeof v === 'object'
? merge(v, b[k])
: v || b[k]
])
),
obj1 = { name: "Arthur", lastName: "King", address: { street: "", city: "Some city", zip: "26772" } },
obj2 = { name: "", lastName: "", address: { street: "Some street", city: "", zip: "" } },
merged = merge(obj1, obj2);
console.log(merged);
.as-console-wrapper { max-height: 100% !important; top: 0; }
https://stackoverflow.com/questions/71980908/
相关文章:
c++ - std::ranges::to 是否允许转换为 std::map?
haskell - 为什么不是 (20 >) 。长度 。取 10 === const True
ios - Xcode 构建失败 : Requested but did not find exte
c++ - 用 CString 替换 LPCTSTR 是否安全?
nuxt.js - 如何在 Nuxt 3 中间件获取当前域?
c++ - 不能在 std::array 上使用 std::apply
r - 使用 Slice 或 Stringr 更改 R 中字符串向量中特定字符串的位置?