fanjavaid
fanjavaid

Reputation: 1738

Compare two arrays and update second array element in Javascript

I have two Arrays :

var allObjects = [
    {
        ani: "082817093649",
        customerID: "C20110324223733_971",
        invoiceDate: "2014-05-20",
        invoiceDebt: "0",
        totalAmount: "160434",
        totalUsage: "140849"
    },
    {
        ani: "082817093649",
        customerID: "C20110324223733_971",
        invoiceDate: "2014-05-20",
        invoiceDebt: "28631",
        totalAmount: "28631",
        totalUsage: "21028"
    },
    {
        ani: "082817054972",
        customerID: "C20111213222859_852",
        invoiceDate: "2012-11-20",
        invoiceDebt: "0",
        totalAmount: "60500",
        totalUsage: "14648"
    },
    {
        ani: "082817054972",
        customerID: "C20111213222859_852",
        invoiceDate: "2014-02-20",
        invoiceDebt: "0",
        totalAmount: "60500",
        totalUsage: "47986"
    },
];

var objRow = [
    {
        customerID  : "C20110324223733_971",
        2014-05-20  : [0, 0, 0] // totalAmount, totalUsage, invoiceDebt
    },
    {
        customerID  : "C20111213222859_852",
        2012-11-25  : [0, 0, 0] // totalAmount, totalUsage, invoiceDebt
    },
    {
        customerID  : "C20111213222859_852",
        2014-02-20  : [0, 0, 0] // totalAmount, totalUsage, invoiceDebt
    }
];

I want to update the data in objRow array with index that same in allObjects array, which condition is from 'customerID' value If the objRow array has same index (date index), the value is Sum of data from allObjects array, and update to objRow array.

So the final result like this :

var objRow = [
    {
        customerID  : "C20110324223733_971",
        2014-05-20  : [189065, 161877, 28631] // totalAmount, totalUsage, invoiceDebt
    },
    {
        customerID  : "C20111213222859_852",
        2012-11-25  : [0, 0, 0] // totalAmount, totalUsage, invoiceDebt
    },
    {
        customerID  : "C20111213222859_852",
        2014-02-20  : [60500, 47986, 0] // totalAmount, totalUsage, invoiceDebt
    }
];

I already try to compare two arrays using loop, But it makes duplicate in date index. :( Here is my code :

for (var b = 0; b < objRow.length; b++) {

    for (var a = 0; a < allObjects.length; a++) {

        if (objRow[b].customerID == allObjects[a].customerID) {

            objRow[b][allObjects[a].invoiceDate] = [allObjects[a].totalAmount,allObjects[a].totalUsage,allObjects[a].invoiceDebt];

        }

    }

}

Please help, thank you.

Upvotes: 0

Views: 104

Answers (1)

hindmost
hindmost

Reputation: 7205

First you have to populate temporary object map mapping customerID and invoiceDate to appropriate property values. Then you can use it to obtain the desired result:

var map = {};
for (var n = allObjects.length, i = 0; i < n; i++) {
    var el = allObjects[i], id = el.customerID, date = el.invoiceDate;
    if (!(id in map)) map[id] = {};
    if (!(date in map[id])) map[id][date] = [0, 0, 0];
    var arr = map[id][date];
    arr[0] += el.totalAmount;
    arr[1] += el.totalUsage;
    arr[2] += el.invoiceDebt;
}

n = objRow.length; i = 0;
for (; i < n; i++) {
    var el = objRow[i], id = el.customerID;
    for (var key in el) {
        if (key != 'customerID')
            el[key] = id in map && key in map[id]? map[id][key] : [0,0,0];
    }
}

Upvotes: 1

Related Questions