根据id将json数组组合为一个json数组

combine json array into one json array by id

本文关键字:数组 json 一个 组合 id 根据      更新时间:2023-09-26

我想通过匹配json的属性值将item和purchases数组合并为一个。

来源:

{
    "item": [
        {
            "invoiceId": 1
        },
        {
            "invoiceId": 2
        },
        {
            "invoiceId": 3
        }
    ],
    "purchase": [
        {
            "id": "1",
            "date": "12/1/2014"
        },
        {
            "id": "2",
            "date": "12/1/2014"
        },
        {
            "id": "3",
            "date": "12/1/2014"
        }
    ]
}

我想生产这样的东西:

{
    "combined": [
        {
            "invoiceId": 1,
            "id": "1",
            "date": "12/1/2014"
        },
        {
            "invoiceId": 2,
            "id": "2",
            "date": "12/1/2014"
        },
        {
            "invoiceId": 3,
            "id": "3",
            "date": "12/1/2014"
        }
    ]
}

如何将item.invoiceId与purchase.id匹配?

解决方案

假设obj是您的对象

var new_obj = {combined:[]};
obj["purchase"].forEach(function(a) {
    obj["item"].forEach(function(b){ 
        if (+b["invoiceId"]===(+a["id"])) {
            a["invoiceId"] = b["invoiceId"] || 0;//WILL MAKE INVOICEID 0 IF IT IS NOT DEFINE. CHANGE 0 TO YOUR NEEDS
            new_obj.combined.push(a);
        }
    });
});

它的工作原理

第一个CCD_ 2循环通过CCD_。然后我们循环通过obj.item来检查它们是否是匹配的invoiceId(如果您不需要确保它们是匹配的invoiceId,请使用备用代码。然后,我们只需在new_obj 中添加一个新值


结果(从控制台复制)为:

{
    "combined":[
        {
            "id":"1",
            "date":"12/1/2014",
            "invoiceId":1
        },
        {
            "id":"2",
            "date":"12/1/2014",
            "invoiceId":2
        },
        {
            "id":"3",
            "date":"12/1/2014",
            "invoiceId":3
        }
    ]
} 

备选代码

如果您不需要确定invoiceId是否存在,请使用此选项

var new_obj = {combined:[]};
obj["purchase"].forEach(function(a){a["invoiceId"]=a["id"];new_obj.combined.push(a);});

实现您想要的目标的一种方法是

var result = {};
var getMatchingPurchase = function(invoiceId) {
    return data.purchase.filter(function(purchase) {
        return invoiceId == purchase.id; 
    })[0];
};
result.combined = data.item.map(function(invoice) {
    var purchase = getMatchingPurchase(invoice.invoiceId);
    return {
        invoiceId: invoice.invoiceId,
        id: purchase.id,
        date: purchase.date
    };
});
console.log(result);

它将像下面的一样打印

{ combined:
   [ { invoiceId: 1, id: '1', date: '12/1/2014' },
     { invoiceId: 2, id: '2', date: '12/1/2014' },
     { invoiceId: 3, id: '3', date: '12/1/2014' } ] }

注意:-我使用的是IE8不支持的映射过滤器功能。如果你想在IE8中使用,你必须使用for loop

如果你必须支持像IE8这样的旧浏览器(可怜的家伙…),请注意本机forEach可能不受支持,在这种情况下,你可以使用lodash来实现跨浏览器兼容性:

function getCombinedResult(source){
    var combinedList = [];
    _.each(source.item, function(item){
        _.each(source.purchase, function(purchase){
            if (item['invoiceId'].toString() != purchase['id'].toString()) return;
            var combinedItem = _.extend(item, purchase)
            combinedList.push(combinedItem);
        });
    })
    return {"combined": combinedList};
}