javascript - 如何合并具有空字符串值的对象?

我正在努力合并 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 将空字符串视为不同于 undefinednull 的值。

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/

相关文章:

postgresql - Prisma 生成的类型不更新

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 中字符串向量中特定字符串的位置?

r - 在嵌套列表中从第一个列表中选择第一个元素,从第二个列表中选择第二个元素,依此类推

module - 是否有一种简洁/内联的方式来创建 Set 值而不显式命名它们的类型?