具有嵌套属性的Javascript合并对象
让我们看一下下面的示例:具有嵌套属性的Javascript合并对象,javascript,object,merge,Javascript,Object,Merge,让我们看一下下面的示例: var ref = { "fullName": { "rules": { "type": "string", "minLength": 4, "maxLength": 64 }, "description"
var ref = {
"fullName": {
"rules": {
"type": "string",
"minLength": 4,
"maxLength": 64
},
"description": "Full name of a user."
}
};
var user = {
"fullName": {
"rules": {
"required": true,
"maxLength": 128
},
"message": "You have submitted a wrong full name."
}
};
现在我想要的是:
var res = {
"fullName": {
"rules": {
"required": true,
"maxLength": 128
"type": "string",
"minLength": 4
},
"description": "Full name of a user.",
"message": "You have submitted a wrong full name."
}
};
我所尝试的:
function mergeNestedObjects(firstObject, secondObject) {
var finalObject = {};
for (var propertyKey in firstObject) {
var propertyValue = firstObject[propertyKey];
if (typeof(propertyValue) === "object") {
finalObject[propertyKey] = mergeNestedObjects(firstObject[propertyKey], secondObject[propertyKey]);
} else if (secondObject[propertyKey] === undefined) {
finalObject[propertyKey] = firstObject[propertyKey];
} else {
finalObject[propertyKey] = secondObject[propertyKey];
}
}
return finalObject;
}
上面的函数合并了,但不知何故没有嵌套属性
更新和回答让它工作了,我忘记了第二个对象太慢了,太傻了。感谢@AnthonyGrist
function mergeProperties(propertyKey, firstObject, secondObject) {
var propertyValue = firstObject[propertyKey];
if (typeof(propertyValue) === "object") {
return mergeNestedObjects(firstObject[propertyKey], secondObject[propertyKey]);
} else if (secondObject === undefined || secondObject[propertyKey] === undefined) {
return firstObject[propertyKey];
}
return secondObject[propertyKey];
}
function mergeNestedObjects(firstObject, secondObject) {
var finalObject = {};
// Merge first object and its properties.
for (var propertyKey in firstObject) {
finalObject[propertyKey] = mergeProperties(propertyKey, firstObject, secondObject);
}
// Merge second object and its properties.
for (var propertyKey in secondObject) {
finalObject[propertyKey] = mergeProperties(propertyKey, secondObject, firstObject);
}
return finalObject;
}
这是一个很老的问题,但可能很有用。 一点递归
function mergeObjects(og, so) {
for (var key in so) {
if (typeof (og[key]) === 'object') {
mergeObjects(og[key], so[key]);
} else {
if (og[key] || typeof (og[key]) === 'boolean') {
og[key] = so[key];
}
}
}
return og;
}
mergeObjects(ref, user);
您只在
firstObject
的键上迭代,因此生成的对象只会与传入的第一个对象具有相同的键。您还需要遍历secondObject
的键,并添加缺少的键。@onlineracoon:我尝试了您的代码,属性嵌套正确。唯一的问题是,正如Anthony指出的,一些属性丢失了。@AnthonyGrist成功了,我真是太蠢了lol。现在我得到了这个问题:它能不能再短一些,看起来我做了很多复制品code@onlineracoon您可以回答自己的问题并将其标记为已接受。:)我想让@AnthonyGrist回答这个问题,因为他给出了答案,他值得表扬。这是一个缺陷。当我们合并a={a:{z:1},b:{y:1},c:{z:1}时,这会失败;b={c:{zye:1}};因为我们没有检查调用中的第二个对象中是否存在键:return mergeNestedObjects(firstObject[propertyKey],secondObject[propertyKey])
function mergeObjects(og, so) {
for (var key in so) {
if (typeof (og[key]) === 'object') {
mergeObjects(og[key], so[key]);
} else {
if (og[key] || typeof (og[key]) === 'boolean') {
og[key] = so[key];
}
}
}
return og;
}
mergeObjects(ref, user);