Json 如何在TypeScript中将嵌套对象与空属性合并

Json 如何在TypeScript中将嵌套对象与空属性合并,json,typescript,merge,Json,Typescript,Merge,假设我有一个在测试设置函数中创建的对象,看起来像这样(实际上更复杂,但只显示相关位): 我想在类似的函数中重用该对象,但使用空的节数组。是否有一种方法可以将该部分重写为空 例如: let modified = someMerge(original, { app: { sections: [ { id: 100, items: [] },

假设我有一个在测试设置函数中创建的对象,看起来像这样(实际上更复杂,但只显示相关位):

我想在类似的函数中重用该对象,但使用空的
数组。是否有一种方法可以将该部分重写为空

例如:

let modified = someMerge(original, {
    app: {
        sections: [
            {
                id: 100,
                items: []
            },
            {
                id: 200
            }
        ]
    }
})
结果对象为:

{
    client: {
        id: 1
    },
    server: {
        id: 2
    },
    app: {
        sections: [
            {
                id: 100,
                items: []        // Now empty
            },
            {
                id: 200
            }
        ]
    }
}
如果我尝试使用
\uuu.merge
,我相信生成的数组不是空的

我想知道是否有比:
original.app.sections[0].items=[]
更优雅的方法,因为可能有多个嵌套的键控属性需要覆盖。

您可以使用它来提供一个自定义合并操作的函数。听起来你想要的是:

  • 部分下时
  • 如果合并两个数组
  • 如果第二个数组为空,则将其替换为第一个数组
  • 如果我理解正确,你可以这样纠正:

    type Sections={Sections:{id:number,items:string[]}[]};
    功能部分(项目:任何):
    项目为章节
    {
    return item.sections!==未定义;
    }
    功能分区切割机(左:任意,右:任意){
    如果(u.isArray(左)和&u.isArray(右)){
    if(right.length==0){
    返回[];
    }
    }
    //否则像正常情况一样合并
    返回未定义;
    }
    函数TopMerge(左:任意,右:任意){
    if(isSections(左)和isSections(右)){
    返回合并(左、右、分段合并);
    }
    //执行默认合并逻辑
    返回未定义;
    }
    让结果=\ u0.mergeWith(
    起初的
    托梅奇,
    顶级合并
    );
    控制台日志(结果);
    
    我使用with
    isSections
    来简化案例1的推理,但这不是必需的。

    您可以使用它来提供一个自定义合并操作的函数。听起来你想要的是:

  • 部分下时
  • 如果合并两个数组
  • 如果第二个数组为空,则将其替换为第一个数组
  • 如果我理解正确,你可以这样纠正:

    type Sections={Sections:{id:number,items:string[]}[]};
    功能部分(项目:任何):
    项目为章节
    {
    return item.sections!==未定义;
    }
    功能分区切割机(左:任意,右:任意){
    如果(u.isArray(左)和&u.isArray(右)){
    if(right.length==0){
    返回[];
    }
    }
    //否则像正常情况一样合并
    返回未定义;
    }
    函数TopMerge(左:任意,右:任意){
    if(isSections(左)和isSections(右)){
    返回合并(左、右、分段合并);
    }
    //执行默认合并逻辑
    返回未定义;
    }
    让结果=\ u0.mergeWith(
    起初的
    托梅奇,
    顶级合并
    );
    控制台日志(结果);
    

    我使用with
    isSections
    使案例1更容易推理,但它不是必需的。

    有什么比直接赋值更优雅?它完全按照您的需要修改对象。如何定义优雅?这是一种只需要更改一个属性的情况。可能有多个。类似于\.merge“递归地将源对象的自身和继承的可枚举字符串键控属性合并到目标对象中”。但是它不允许您用未定义的值覆盖已有的键…那么您可能需要熟悉
    .mergeWith()
    函数。有什么比直接赋值更优雅的呢?它完全按照您的需要修改对象。如何定义优雅?这是一种只需要更改一个属性的情况。可能有多个。类似于\.merge“递归地将源对象的自身和继承的可枚举字符串键控属性合并到目标对象中”。但它不允许您用未定义的值覆盖已有的键…您可能需要熟悉
    \uuuu.mergeWith()
    函数。
    {
        client: {
            id: 1
        },
        server: {
            id: 2
        },
        app: {
            sections: [
                {
                    id: 100,
                    items: []        // Now empty
                },
                {
                    id: 200
                }
            ]
        }
    }