Javascript 组合我的对象并获得预期结果

Javascript 组合我的对象并获得预期结果,javascript,jquery,html,arrays,Javascript,Jquery,Html,Arrays,我正在尝试合并我的对象,并得到如下结果 { "sports": { "basketball": "kobe", "swimming": { }, "football": "ronaldo", "running": "", "highJump": "" }, "calendar": ["21", "25", "30"] } 我的逻辑有问题,你能帮我吗 但是,如果我交替使用我的s

我正在尝试合并我的对象,并得到如下结果

{
    "sports": {
        "basketball": "kobe",
        "swimming": {
        },
        "football": "ronaldo",
        "running": "",
        "highJump": ""
    },
    "calendar": ["21", "25", "30"]
}
我的逻辑有问题,你能帮我吗 但是,如果我交替使用我的sportA和SportB值,我会得到预期值 结果…不确定我当前场景中的问题是什么 在下面提供我的代码。 不停摆弄 在启用深度合并的情况下,可以使用jQuery执行以下操作:

var output = $.extend(true, sportsB, sportsA)
产出:

{
    "sports": {
        "basketball": "kobe",
        "swimming": {},
        "football": "ronaldo",
        "running": "",
        "highJump": ""
    },
    "calendar": ["21", "25", "30"]
}
这里是纯JS:

function merge(obj1, obj2) {
    var result = {};

    for (var prop in obj1) {
        if (typeof obj1[prop] === "object" && typeof obj2[prop] === "object")
            result[prop] = merge(obj1[prop], obj2[prop]);
        else
            result[prop] = obj1[prop];
    }

    for (var prop in obj2) {
        result[prop] = (result[prop]? result[prop]: obj2[prop]);
    }

    return result;
}

console.log(merge(sportsA, sportsB));
但是,这将返回一个新对象,而不是修改现有对象

在第一个for..In循环中,我们检查是否需要首先递归,否则设置result的属性

在第二个for..In循环中,我们检查属性是否已定义或是否为空,并相应地设置属性

输出:

{
    "sports": {
        "basketball": "kobe",
        "football": "ronaldo",
        "swimming": {},
        "running": "",
        "highJump": ""
    },
    "calendar": ["21", "25", "30"]
}

逻辑正在中断,因为当您仅在其中一个对象中循环属性键时,将看不到仅存在于另一个对象中的属性键

可以使用返回属性名数组的object.keys获取对象的根级别键。然后,您可以在同一级别合并两组键,并了解所需的所有最终输出属性


然后迭代这些以获得最终结果

当您检查sportsA.hasOwnPropertyp时出错。在您的情况下,您只更新sportsA中的属性,而不从sportsB添加新属性

另外,如果sportsB[p]有falsy值,您不想更新它,因为我使用了sportsB[p]| | sportsA[p]

检查此代码

体育报={ 体育:{ 篮球:科比, 足球:罗纳尔多 } }; var sportsB={ 体育:{ 篮球:, 游泳:{ }, 足球:, 运行:, 跳高: }, 日历:[21、25、30] }; 功能合并SportsA、sportsB{ 对于sportsB中的var p 如果sportsA.hasOwnPropertyp{ sportsA[p]=sportsB[p]=“对象”?合并sportsA[p],sportsB[p]:sportsB[p]| | sportsA[p]; }否则{ sportsA[p]=sportsB[p]; } 回归体育a; } 合并运动A、运动B; console.log意外结果+sportsA;
console.log sportsA@我不明白。OP希望第二个对象的非空字段覆盖空字符串。我已经将mark_c答案与OP建议的有效输出进行了比较,它似乎工作正常。@itachi更改参数,即true,sportsA,sportsB@itachi我在控制台中得到了不同的输出,不知道为什么。他的回答是正确的+1实际上,这并不是万能的……切换顺序,结果会有所不同。但不确定OP用例either@charlietfl-你能把这个评论再详细一点吗?我不确定问题会是什么。当你有两个字符串值,每个值一个时,会发生什么?您将大多数字符串留空,并且没有在预期结果中涵盖这些内容。应该定义合并规则。始终使用A值覆盖B,或合并A和B的结果。谢谢。。。你能告诉我为什么游泳排在第三排而不是第二排吗@texirv顺序并不重要。完全
{
    "sports": {
        "basketball": "kobe",
        "football": "ronaldo",
        "swimming": {},
        "running": "",
        "highJump": ""
    },
    "calendar": ["21", "25", "30"]
}