0

2 つの json オブジェクトがあり、それらをマージする必要があるとします。

css: [{
        drag: "mode() == 'layout'",
        ui_draggable: "mode() == 'layout'"
}]

css: [{
        someclass : true
}]

私は最終的にしたい:

css: [{
        drag: "mode() == 'layout'",
        ui_draggable: "mode() == 'layout'",
        someclass : true
}]

さらに試行錯誤した結果、これを思いつきましたが、いくつかのバグまたは役に立たないコード行を配置したと思います。

少し遊んだ後、このコードを思いつきました。私のニーズでは、2 つ以上のレベルを再帰する必要はなかったので、これで問題ありません。確かにかなり洗練されている可能性がありますが、バインディングノックアウトには最適です. これを使用してjquery unobtrusive knockoutjsを拡張する方法の例を次に示します

    var settings = {
        text: 'SelectedCard().CardData.Title',
        visible: "mode() != 'edit' || !isMyCard()",
        css: [{ drag: "mode() == 'layout'" , selectedElement: "selectedCardElement() == '_titlePreview'"}]
    };
    var settings2 = 
        {
            css: [{ drag: "mode() == 'layout'"}]
    };
   var settings3 =  merge(settings, settings2);

function merge(first, second) {

    for (var a1 in first) {
        // if second object is null we are finished.
        used.push(a1);
        if (second[a1] == null) {
            continue;
        } else {

            var ob2 = second[a1];
            if (typeof (first[a1]) != typeof (ob2)) {
            throw new Error("conflicting properties named:" + a1);
            }

            if ($.isArray(first[a1])) {

                for (var i = 0; i < ob2.length; i++) {
                    first[a1].push(ob2[i]);
                }

            } else {
                // matching property. 
                return merge(first[a1], second[a1]);
            }
        }
    }
    for (var a2 in second) {
        if (used.indexOf(a2) < 0) {
            first[a2] = second[a2];
        }
    }
    return first;
}
4

1 に答える 1

3

1) 両方のオブジェクトを一方向上書きでマージするには、次のようにします。

for (var attrname in obj2) { 
    obj1[attrname] = obj2[attrname]; 
}

2) 選択的にマージするには、両方の方法:

obj1.someclass = obj2.someclass;

-また-

obj2["someclass"] = obj1["someclass"];

この場合、プロパティがまだオブジェクトに存在しない場合は、割り当てる前に定義する必要はありません。

3) Underscore.jsのようなライブラリを使用して、次のような「配列関数」を実行することを検討してください。

_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]);

returns [1, 2, 3, 101, 10] 

4) 最後に、JSON オブジェクト、配列、およびそれらの組み合わせをフォーマットするための強力なリソースを次に示します: jsonexample.com。これは、複雑な「配列関数」に入るときに役立ちます。

乾杯!

于 2012-05-21T22:29:37.180 に答える