_.groupBy динамические ключи - PullRequest
       12

_.groupBy динамические ключи

1 голос
/ 07 апреля 2019

Я работаю с этой структурой данных и пытаюсь создать общий объект для ключей (patApplied & insApplied).

Я запутался в использовании _.groupBy для patApplied и insApplied при работе с динамическими именами ключей (они могут изменяться в зависимости от выбора пользователя).

Я пытаюсь сгруппировать карту / уменьшить значения до нужного total объект

[
  {
    procedure: '01402',
    fee: 82.08,
    patApplied: {
      'Credit Adjustment': 20,
      'User payment': 30
    },
    insApplied: {
      insPayment: 5,
      'ins check': 10
    }
  },
  {
    procedure: '01801',
    fee: 165.16,
    patApplied: {
      'Credit Adjustment': 0,
      'User payment': 10
    },
    insApplied: {
      insPayment: 0,
      'ins check': 7
    }
  }
]

желаемый вывод

let total = {
  patApplied: [ {Credit Adjustment: 20},{User payment: 40} ]
  insApplied: [ {insPayment: 10},{ins check: 7} ]
}

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

Вы можете использовать Array.prototype.reduce() и for..in.

const arr = [{"procedure":"01402","fee":82.08,"patApplied":{"Credit Adjustment":20,"User payment":30},"insApplied":{"insPayment":5,"ins check":10}},{"procedure":"01801","fee":165.16,"patApplied":{"Credit Adjustment":0,"User payment":10},"insApplied":{"insPayment":0,"ins check":7}}]



let total = arr.reduce((ac,a) => {
  ['patApplied','insApplied'].forEach(k => {
    for(let key in a[k]){
      ac[k][key] = ac[k][key] || 0;
      ac[k][key] += a[k][key]
      
    }
  })
  return ac;
},{patApplied:{},insApplied:{}})


console.log(total);
2 голосов
/ 07 апреля 2019

Объедините объекты, расширив их до _.mergeWith(), а затем извлеките нужные свойства с помощью _.pick():

const data = [{"procedure":"01402","fee":82.08,"patApplied":{"Credit Adjustment":20,"User payment":30},"insApplied":{"insPayment":5,"ins check":10}},{"procedure":"01801","fee":165.16,"patApplied":{"Credit Adjustment":0,"User payment":10},"insApplied":{"insPayment":0,"ins check":7}}]

const result = _.pick(
  _.mergeWith({}, ...data, (obj, src) => _.isNumber(obj) ? obj + src : undefined)
, ['patApplied', 'insApplied'])

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

И более краткая версия того же решения с использованием lodash / fp и _.flow():

const { flow, mergeAllWith, cond, isNumber, add, pick } = _

const fn = _.flow(
  mergeAllWith(cond([[isNumber, add]])),
  pick(['patApplied', 'insApplied'])
)

const data = [{"procedure":"01402","fee":82.08,"patApplied":{"Credit Adjustment":20,"User payment":30},"insApplied":{"insPayment":5,"ins check":10}},{"procedure":"01801","fee":165.16,"patApplied":{"Credit Adjustment":0,"User payment":10},"insApplied":{"insPayment":0,"ins check":7}}]

const result = fn(data)

console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
...