Javascript合并对象与嵌套属性

时间:2012-12-13 13:53:58

标签: javascript object merge

让我们看一下下面的例子:

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."
    }
};

现在我想要的是:

  1. 合并对象&属性。
  2. 保留第二个对象的属性(如果已设置)(maxLength)
  3. 以下是我期望的结果:

    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[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;
    } 
    

2 个答案:

答案 0 :(得分:6)

function mergeProperties(propertyKey, firstObject, secondObject) {
    var propertyValue = firstObject[propertyKey];

    if (typeof(propertyValue) === "object") {
        return mergeNestedObjects(firstObject[propertyKey], secondObject[propertyKey]);
    } else if (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;
} 

答案 1 :(得分:1)

相当古老的问题,但可能有用。 一点点的递归。

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