_.groupПо динамическим ключам

Я работаю с этой структурой данных и пытаюсь создать общий объект для ключей (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} ]
}

Почему insPayment есть 10 должно быть 5.

Maheer Ali 07.04.2019 21:08

А еще ins check должно быть 17, а не 7, верно?

Mihai 07.04.2019 21:09

@Mihai это предварительный код sudo, и ты прав! :)

Deano 07.04.2019 21:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
233
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Объедините объекты, распределив их в _.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.info(result)
<script src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

И более краткая версия того же решения с использованием Лодаш/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.info(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>

Вы можете использовать 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.info(total);

Я думаю, что этот ответ проще, чем первый ответ

user2398069 07.04.2019 22:34

Другие вопросы по теме