json javascript中的排序合并逻辑

json javascript中的排序合并逻辑,javascript,json,Javascript,Json,我们有两个类似上面的回答。现在我必须将json1和json2合并为一个json3,如下所示: json1 = { "t": { "o": [{ "name": "tor", "pair": 1 }], "i": [{ "name": "tiset", "pair": 1 }] } } json2 = { "t":

我们有两个类似上面的回答。现在我必须将
json1
json2
合并为一个
json3
,如下所示:

json1 = {
    "t": {
        "o": [{
            "name": "tor",
            "pair": 1
        }],
        "i": [{
            "name": "tiset",
            "pair": 1
        }]
    }
}
json2 = {
    "t": {
        "a": [{
            "name": "tapch",
            "pair": 1
        }],
        "i": [{
            "name": "tiset",
            "pair": 9
        }]
    }
}
也就是说,若名称相同,那个么将取出最大对。我试了很多,但没有找到解决办法。有人能帮我吗?我需要它作为一个循环,而不是一个特定的硬编码解决方案。

应该相当容易

就拿第一个JSON对象来说吧

json3 = {
    "t": {
        "a": [{
            "name": "tapch",
            "pair": 1
        }],
        "o": [{
            "name": "tor",
            "pair": 1
        }],
        "i": [{
            "name": "tiset",
            "pair": 9
        }]
    }
}
[Edit:]如果您真的想保留json1,可以选择另一种方式

var json3 = json1;
将第二个对象合并到其中

var json3 = {'t':{}};
for (key in json1['t']) {
    json3['t'][key] = json1['t'][key];
}
你完成了

应该相当容易

就拿第一个JSON对象来说吧

json3 = {
    "t": {
        "a": [{
            "name": "tapch",
            "pair": 1
        }],
        "o": [{
            "name": "tor",
            "pair": 1
        }],
        "i": [{
            "name": "tiset",
            "pair": 9
        }]
    }
}
[Edit:]如果您真的想保留json1,可以选择另一种方式

var json3 = json1;
将第二个对象合并到其中

var json3 = {'t':{}};
for (key in json1['t']) {
    json3['t'][key] = json1['t'][key];
}

如果第一个是原语值,第二个是对象(我让它被对象覆盖),那么可能需要对现有的处理值进行一些调整,因为在您的问题中没有明确说明这一点

原语值仅由您传递的函数处理,但您应该通过阅读代码来理解它

这应该接近你所需要的

它会将所有传递的对象合并为一个对象,(最后一个参数是函数处理相同的primiitve属性)如果传递了一个函数,它不会在最后一个对象上迭代,如果没有,所有参数都将被视为要合并的对象,您可以并且应该对此进行一些调整,因为我现在不太关心代码的清洁度

也许这有助于你进入正确的方向

for (key in json2['t']) {
    json3['t'][key] = json2['t'][key];
}
函数合并(){
var srt=typeof arguments[arguments.length-1]=“function”?arguments[arguments.length-1]:函数(a、b、prop){
返回a[prop]>b[prop]?a[prop]:b[prop];
};
var merge={};
对于(变量i=0;ib[prop]?a[prop]:b[prop];//如果属性是pair,则返回较大的一个
else返回b[prop];//返回要合并的对象
});
console.log(json3);
/*{“a”:“test”,“t”:{“a”:[{“name”:“tapch”,“pair”:1}],“i”:[{“name”:“tiset”,“pair”:9}],“o”:[{“name”:“tor”,“pair”:1}}}}}*/
下面是一个关于

评论 若要仅合并某些属性,可以添加一个参数作为属性的映射 然后,如果存在映射,则对映射属性进行迭代,并仅复制它们。 如果没有,请复制对象中的所有特性以合并

因此,在代码方面,这可能是这样的:

function merge() {
    var srt = typeof arguments[arguments.length - 1] == "function" ? arguments[arguments.length - 1] : function (a, b, prop) {
            return a[prop] > b[prop] ? a[prop] : b[prop];
        };
    var merge = {};

    for (var i = 0; i < arguments.length - (typeof arguments[arguments.length - 1] == "function" ?1:0); i++)
    inner(arguments[i], merge);

    function inner(obj, mrg) {
        var type = ({}).toString.call(obj);
        if (type == "[object Object]") {
            if (!mrg || typeof mrg != "object" ) mrg = {}; //Well it depends if you want primitive values to be overwritten by an Object or not
            for (var prop in obj)
            if (!mrg[prop] && typeof obj[prop] == "object") mrg[prop] = inner(obj[prop]);
            else if (mrg[prop] && typeof obj[prop] == "object") mrg[prop] = inner(obj[prop], mrg[prop]);
            else if (mrg[prop]) mrg[prop] = srt(mrg, obj, prop);
            else mrg[prop] = obj[prop];

        } else if (type == "[object Array]") {
            if (!mrg) mrg = [];
            for (var i = 0; i < obj.length; i++)
            if (!mrg[i] && typeof obj[i] == "object") mrg[i] = inner(obj[i]);
            else if (mrg[i] && typeof obj[i] == "object") mrg[i] = inner(obj[i], mrg[i]);
            else if (mrg[i]) mrg[i] = srt(mrg, obj, i);
            else mrg[i] = obj[i];
        } else {
            // Handle calling of the inner function with a primitive value
        }
        return mrg;
    }
    return merge;
}

var json1 = {
    "t": {
        "o": [{
            "name": "tor",
            "pair": 1
        }],
        "i": [{
            "name": "tiset",
            "pair": 1
        }]
    }
};
var json2 = {
    "t": {
        "a": [{
            "name": "tapch",
            "pair": 1
        }],
        "i": [{
            "name": "tiset",
            "pair": 9
        }]
    }
};

var json3 = merge(json1, json2, {
    a: "test"
}, function (a, b, prop) {
    if (prop == "pair") return a[prop] > b[prop] ? a[prop] : b[prop]; //If the propertie is pair, return the bigger one
    else return b[prop]; //return the to merge Object
});
console.log(json3);
/*{"a": "test", "t": {"a": [{"name": "tapch", "pair": 1}], "i": [{"name": "tiset", "pair": 9}], "o": [{"name": "tor", "pair": 1}]}}*/  
函数合并(){
var srt=typeof arguments[arguments.length-1]=“function”?arguments[arguments.length-1]:函数(a、b、prop){
返回a[prop]>b[prop]?a[prop]:b[prop];
};
var merge={};
var map=arguments[arguments.length-2]。_map?arguments[arguments.length-2]:false;
删除地图
对于(变量i=0;i