1

jQuery.extend()次のような方法でオブジェクトをマージするのに役立ちます:

var a = {
    'x': 2,
    'y': 3,
    'etc': {
        'm': 3,
        'n': 5
    }
};
var b = {
    'x': 4,
    'z': 1,
    'etc': {
        'm': 2,
        'p': 3
    }
};

$.extend(true, a, b); // true for recursively merge
/* Result:
    a = {
        'x': 4,
        'y': 3,
        'z': 1,
        'etc': {
            'm': 2,
            'n': 5,
            'p': 5
        }
    };
*/

しかし、私が興味を持っているのは、 に既に存在するプロパティのみですa。つまり、たとえば、zが のプロパティでaない場合、結果に含まれるべきではありません。したがって、期待される結果は次のようになります。

a = {
    'x': 4,
    'y': 3,
    'etc': {
         'm': 2,
         'n': 5,
     }
};

jQueryでこれを達成する簡単な方法があるのだろうか、またはこのようなブルー​​トフォースを使用してのみ達成できるのだろうか(a最大2つのレイヤーがある条件下で):

for (var i in b) {
    if (a.hasOwnProperty(i)) {
        if (typeof a[i] === 'object') {
            for (var j in b[i]) {
                if (a[i].hasOwnProperty(j)) {
                    a[i][j] = b[i][j];
                }
            }
        } else {
            a[i] = b[i];
        }
    }
}

デモ: http://jsfiddle.net/hUkAS/3/

4

1 に答える 1

0

私はそのような関数を認識していませんが、2 つのオブジェクト (ハッシュ) 幅の任意の数のレイヤーをマージする汎用関数を作成しました。

//The function
function leftMerge(a, b) {
    for (var i in b) {
        if (a.hasOwnProperty(i)) {
            console.log(typeof a[i]);
            if (typeof a[i] == 'object' && typeof b[i]== 'object')
                leftMerge(a[i], b[i]);
            else
                a[i] = b[i]
        }
    }
}

// a test
var obj_a = {
    'x': 2,
    'y': 3,
    'etc': {
        'm': 3,
        'n': 5,
        'j': {
            'h': 15,
            'i':16
        }
    }
};
var obj_b = {
    'x': 4,
    'z': 1,
    'etc': {
        'm': 2,
        'p': 3,
        'j': {
            'i':2,
            'l':22
        }
    }
};

leftMerge(obj_a, obj_b);
console.log(obj_a);

それが役立つことを願っています。

于 2012-11-29T03:11:09.403 に答える