как объединить два массива объектов разного размера по ключу с помощью lodash - PullRequest
0 голосов
/ 05 октября 2018
Stocks: [{
    PRN: 1,
    PID: 1,
    Qty: 3,
    SlNos: [1, 2, 3]
}, {
    PRN: 1,
    PID: 2,
    Qty: 4,
    SlNos: [10, 11, 12, 13]
}, {
    PRN: 2,
    PID: 1,
    Qty: 3,
    SlNos: [4, 5, 6]
}, {
    PRN: 2,
    PID: 2,
    Qty: 4,
    SlNos: [14, 15, 16, 17]
}]

Я хочу этот массив как ниже с Lodash

Stocks: [{
    PID: 1,
    Qty: 6,
    SlNos: [1, 2, 3, 4, 5, 6]
}, {
    PID: 2,
    Qty: 4,
    SlNos: [10, 11, 12, 13, 14, 15, 16, 17]
}]

1 Ответ

0 голосов
/ 06 октября 2018

Вот решение с _lodash:

var stocks = [{ PRN: 1, PID: 1, Qty: 3, SlNos: [1, 2, 3] }, { PRN: 1, PID: 2, Qty: 4, SlNos: [10, 11, 12, 13] }, { PRN: 2, PID: 1, Qty: 3, SlNos: [4, 5, 6] }, { PRN: 2, PID: 2, Qty: 4, SlNos: [14, 15, 16, 17] }]

const result = _.reduce(stocks, (r, {PRN, ...c}) => {
   let _c = _.find(r, {'PID': c.PID})
   if(_c)
     _c = _.mergeWith(_c, c, (ov, sv, k) => _.includes(['Qty','SlNos'], k) ? _.isArray(sv) ? (ov || []).concat(sv) : _.isNumber(sv) ? sv + (ov || 0) : sv : ov)
   else
     r.push(c)
   return r
}, [])

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

Мы используем уменьшить с объединить с (которыйздесь главное на самом деле) плюс немного включает в себя .

Вот решение без lodash, которое сделает свое дело:

var stocks = [{ PRN: 1, PID: 1, Qty: 3, SlNos: [1, 2, 3] }, { PRN: 1, PID: 2, Qty: 4, SlNos: [10, 11, 12, 13] }, { PRN: 2, PID: 1, Qty: 3, SlNos: [4, 5, 6] }, { PRN: 2, PID: 2, Qty: 4, SlNos: [14, 15, 16, 17] }]

const result = stocks.reduce((r, c) => {
  _c = r.find(x => x.PID === c.PID)
  if (_c) {
    _c.PID = c.PID
    _c.Qty = _c.Qty + c.Qty
    _c.SlNos = _c.SlNos ? _c.SlNos.concat(c.SlNos) : c.SlNos
  } else {
    r.push(!delete(c.PRN) || c)
  }
  return r
}, [])

console.log(result)

Идея состоит в том, чтобы использовать reduce и сначала find, если у нас уже был этот объект по PID, если это так, суммировать значения, если не вставить в окончательный массив.Поскольку мы просматриваем каждую запись, эта логика выполняет один цикл.

...