json 我怎样才能把两个js对象合并成一个对象,并且第二个对象覆盖第一个对象?在Javascript中有没有原生的方法可以做到?[duplicate]

1wnzp6jl  于 2023-03-20  发布在  Java
关注(0)|答案(2)|浏览(227)

此问题在此处已有答案

How to deep merge instead of shallow merge?(47个答案)
2天前关闭.

json1 = {
      "color": "#101017",
      "fontSize": "15px",
      "h1": {
        "color": "#101017",
        "fontSize": "32px"
      }
}

json2 = {
     "h1": {
        "color": "blue"
     }
}

输出应该是

json = {
      "color": "#101017",
      "fontSize": "15px",
      "h1": {
        "color": "blue",
        "fontSize": "32px"
      }
}

我试图合并两个json,其中第二个用javascript的原生方式覆盖第一个。

ckx4rj1h

ckx4rj1h1#

您发布的这些“JSON对象”可以被视为JavaScript对象,因此我们可以编写一个简单的对象合并函数。注意,此函数将合并对象属性中的任何第一个子对象(如您的示例中所示),但如果您创建更多的子对象,它将无法正常工作。

function objectMerge (first, second) {
    if (typeof first !== "object" || typeof second !== "object") return false;

    const keys = Object.keys(second);
    let ret = first;
    for (let i = 0; i < keys.length; i++) {
        if (ret[keys[i]] !== undefined) {
            if (typeof second[keys[i]] === "object") {
                if (typeof ret[keys[i]] !== "object") {
                    delete ret[keys[i]];
                    ret[keys[i]] = {};
                }
                const keys2 = Object.keys(second[keys[i]]);
                for (let j = 0; j < keys2.length; j++) ret[keys[i]][keys2[j]] = second[keys[i]][keys2[j]];
            }
            else {
                if (typeof ret[keys[i]] === "object") delete ret[keys[i]];
                ret[keys[i]] = second[keys[i]];
            }
        }
        else ret[keys[i]] = second[keys[i]];
    }
    return ret;
}

const json1 = {
      "color": "#101017",
      "fontSize": "15px",
      "h1": {
        "color": "#101017",
        "fontSize": "32px"
      }
};

const json2 = {
     "h1": {
        "color": "blue"
     }
};

console.log(objectMerge(json1, json2));
6mw9ycah

6mw9ycah2#

像这样的东西,也许?

function myMerge(current, update) {
   return Object.keys(update).reduce((acc, key) => {
        if(!acc.hasOwnProperty(key) || typeof update[key] !== 'object') {
            acc[key] = update[key]
        } else {
            myMerge(current[key], update[key])
        }
        return acc
    }, current)
}

相关问题