Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有嵌套属性的Javascript合并对象_Javascript_Object_Merge - Fatal编程技术网

具有嵌套属性的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."
    }
};
现在我想要的是:

  • 合并对象和属性
  • 如果已设置第二个对象的属性(maxLength),则保留这些属性
  • 以下是我预期的结果:

    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);