Reputation: 1738
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
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