Перенос объектов в массиве в другой массив по ключу

1

Я пытаюсь нажать массив объектов на другой существующий массив объектов.

Пример:

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,}];

Так что я пытаюсь взять каждый объект в массиве invoiceLines, и подтолкнуть ее к invoices.Lineitems, если соответствует InvoiceID. Таким образом, это будет выглядеть так:

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}] 
}];

Я пробовал следующее:

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

Как бы то ни было, это просто вталкивается в массив счетов-фактур, а не invoice.LineItems.

Теги:
arrays
lodash

2 ответа

1
Лучший ответ

Вы можете проходить через invoices а затем находить все совпадения в invoiceLines, InvoiceId. ниже пример кода

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)
  • 0
    Отлично спасибо!
2

Поскольку вы используете Lodash, используйте:

  • _.map для итерации по массиву invoices
  • _.filter чтобы найти соответствующие строки из invoiceLines соответствии с InvoiceId: item.InvoiceId
  • _.extend добавить каждый отфильтрованный и сопоставленный invoiceLine в LineItems

Пример ES5:

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:

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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню