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"]
}