読者です 読者をやめる 読者になる 読者になる

javascriptでオブジェクトのプロパティを再起的にマージしてみる

以外と調べても良いのが見つからなかったから自分で作ってみた時の備忘録
配列とかの順番で情報の持ち方が決まっているのであればこれで良いのかも

function mergeProperty(obj1, obj2){
    if(typeof obj2 === "string" ){
        return;
    }
    if(obj2.length !== void 0 && obj2.length > 0){
        for(var i = 0; i < obj2.length; i++ ){
            if(obj1.length <= i ){
                obj1.push(obj2[i]);
            }else{
                mergeProperty(obj1[i], obj2[i]);
            }
        }
    }else{
        for(prop in obj2){
            if(obj1.hasOwnProperty(prop)){
                mergeProperty(obj1[prop], obj2[prop]);
            }else{
                obj1[prop] = obj2[prop];
            }
        }
    }
};


var obj1 = {
    prop1: 'obj1-prop1',
    prop2: [{prop2_1: 'obj1-prop21', prop2_2: 'obj1-prop22'}, {a: 'obj1-prop2_a'}] ,
    prop3: 'obj1-prop3'
};

var obj2 = {
    prop1: 'obj2-prop1',
    prop2: [{prop2_1: 'obj2-prop21', prop2_2: 'obj2-prop22'}, {b: 'obj2-prop2_b'}, { 3: 'obj2-prop2_3'}] ,
    prop_d: 'obj2-prop_d',
    prop_e: ['a', 'b']
};

mergeProperty(obj1, obj2);
JSON.stringify(obj1);
"{"prop1":"obj1-prop1","prop2":[{"prop2_1":"obj1-prop21","prop2_2":"obj1-prop22"},{"a":"obj1-prop2_a","b":"obj2-prop2_b"},{"3":"obj2-prop2_3"}],"prop3":"obj1-prop3","prop_d":"obj2-prop_d","prop_e":["a","b"]}"

こんな感じでobj1にないプロパティがobj2にある場合にのみマージするようになります。