1

I am trying to push an array of objects to another existing array of objects.

Example:

var invoices = [ 
{ 
  InvoiceId: 2,
  Contact: 'Jim',
  InvoiceNumber: '3',
  LineItems: [] 
},
{ 
  InvoiceId: 1002,
  Contact: 'Peter',
  InvoiceNumber: '4' },
  LineItems: [] 
}];


var invoiceLines = [ 
{ Id: 1003,
 InvoiceId: 2 },
 Amount: 1000,
{ Id: 1004,
 InvoiceId: 2,
 Amount: 1000,
{ Id: 1006,
 InvoiceId: 1002,
 Amount: 3000,}];

So I am trying to take each object in the invoiceLines array, and push it to invoices.Lineitems if InvoiceId matches. So it would look like this:

var result= [ 
{ 
 InvoiceId: 2,
 Contact: 'Jim',
 InvoiceNumber: '3',
 LineItems: [{ 
   Id: 1003,
   InvoiceId: 1002,
   Amount: 1000},{ 
   Id: 1004,
   InvoiceId: 1002,
   Amount: 1000}] 
},
{ 
 InvoiceId: 1002,
 Contact: 'Peter',
 InvoiceNumber: '4' },
 LineItems: [{
   Id: 1006,
   InvoiceId: 1002,
   Amount: 3000}] 
}];

I have tried the following:

var result = _({})
 .merge(
  _(flattenedinvoiceLines).groupBy("InvoiceId").value(),
  _(invoices).groupBy("Id").value())
 .values()
 .flatten()
 .value();
}

How ever this just pushes into the invoices array, not invoice.LineItems.

2 Answers 2

2

You can walk through invoices and then find all matches in invoiceLines by validating the InvoiceId is the same. below sample code

var invoices = [ 
{ 
  InvoiceId: 2,
  Contact: 'Jim',
  InvoiceNumber: '3',
  LineItems: []
},
{ 
  InvoiceId: 1002,
  Contact: 'Peter',
  InvoiceNumber: '4',
  LineItems: [] 
}
];

var invoiceLines = [
{ Id: 1003,
 InvoiceId: 2,
 Amount: 1000 
},
{ Id: 1004,
 InvoiceId: 2,
 Amount: 1000,
 },
{ Id: 1006,
 InvoiceId: 1002,
 Amount: 3000
 }
 ];
 
  
 
const result = invoices.map(invoice => {
  invoice.LineItems = invoiceLines.filter((line) => line.InvoiceId === invoice.InvoiceId)
  return invoice;
})
 console.log(result)

Sign up to request clarification or add additional context in comments.

1 Comment

Perfect - Thank you!
2

Since you're using Lodash, use:

  • _.map to iterate over the invoices array
  • _.filter to find each matching lines from invoiceLines according to InvoiceId: item.InvoiceId
  • _.extend to add each filtered and matched invoiceLines to LineItems

ES5 Example:

var invoices = [{
    InvoiceId: 2,
    Contact: 'Jim',
    InvoiceNumber: '3',
    LineItems: []
  },
  {
    InvoiceId: 1002,
    Contact: 'Peter',
    InvoiceNumber: '4',
    LineItems: []
  }
];

var invoiceLines = [{
    Id: 1003,
    InvoiceId: 2,
    Amount: 1000
  },
  {
    Id: 1004,
    InvoiceId: 2,
    Amount: 1000
  },
  {
    Id: 1006,
    InvoiceId: 1002,
    Amount: 3000
  }
];

var mergedInvoices = _.map(invoices, function(item) {
  _.extend(item.LineItems, _.filter(invoiceLines, { InvoiceId: item.InvoiceId }));    
  return item;
});

console.log(mergedInvoices);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

ES6 Example:

const invoices = [{
    InvoiceId: 2,
    Contact: 'Jim',
    InvoiceNumber: '3',
    LineItems: []
  },
  {
    InvoiceId: 1002,
    Contact: 'Peter',
    InvoiceNumber: '4',
    LineItems: []
  }
];

const invoiceLines = [{
    Id: 1003,
    InvoiceId: 2,
    Amount: 1000
  },
  {
    Id: 1004,
    InvoiceId: 2,
    Amount: 1000
  },
  {
    Id: 1006,
    InvoiceId: 1002,
    Amount: 3000
  }
];

const mergedInvoices = _.map(invoices, item => {
  _.extend(item.LineItems, _.filter(invoiceLines, { InvoiceId: item.InvoiceId }));    
  return item;
});

console.log(mergedInvoices);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.