【问题标题】:merge json object with arrays将 json 对象与数组合并
【发布时间】:2012-05-28 08:54:30
【问题描述】:

假设我有两个 json 对象,我需要合并它们。

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

css: [{
        someclass : true
}]

我想结束:

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

经过进一步的试验,我想出了这个,但我认为我在其中放置了一些错误或无用的代码行。

在玩了一会儿之后,我想出了这段代码。我的需求不需要递归超过两个级别,所以这很好。我敢肯定,它可能会更加精致,但它非常适合绑定淘汰赛。这是我如何使用它来扩展 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;
}

【问题讨论】:

标签: json merge knockout.js unobtrusive


【解决方案1】:

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。这将有助于您了解复杂的“数组函数”。

干杯!

【讨论】:

    猜你喜欢
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多