Как рассчитать номер ключа определенного свойства из объекта JSON - PullRequest
0 голосов
/ 22 ноября 2018

Изображение У меня есть

const events: {
        '12327ae260fe9431': {
          eventType: 'DEVICE_LINK_ERR',
          key: '12327ae260fe9431',
          severity: 'ERROR',
          timestamp: 1542199782975,
          title: 'Link went down unexpectedly',
        },
        '62d29fab77bddd7': {
          eventType: 'DEVICE_LINK_ERR',
          key: '62d29fab77bddd7',
          severity: 'ERROR',
          timestamp: 1542199783055,
          title: 'Link went down unexpectedly',
        },
      },

Я хочу вычислить общую серьезность и построить severityCounts объект, подобный этому

 severityCounts: {
        CRITICAL: 0,
        ERROR: 2,
        INFO: 0,
        WARNING: 0,
      }

, и у меня есть доступ к Lodash.Как мне это сделать?

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Вы можете использовать Object.values() для генерации массива всех ваших значений, а затем, используя array#reduce, вы можете создать объект со счетчиком каждого severity счетчика.

const events = { '12327ae260fe9431': { eventType: 'DEVICE_LINK_ERR', key: '12327ae260fe9431', severity: 'ERROR', timestamp: 1542199782975, title: 'Link went down unexpectedly', }, '62d29fab77bddd7': { eventType: 'DEVICE_LINK_ERR', key: '62d29fab77bddd7',severity: 'ERROR', timestamp: 1542199783055, title: 'Link went down unexpectedly', }, },
      severityCounts = Object.values(events).reduce((r, {severity}) => {
        r[severity] = ( r[severity] || 0 ) + 1;
        return r;
      },{ CRITICAL: 0, ERROR: 0, INFO: 0, WARNING: 0});
console.log(severityCounts);
0 голосов
/ 22 ноября 2018

Вы можете сгруппировать данные по severity, получить длину и назначить всю информацию одному объекту.

var data = { '12327ae260fe9431': { eventType: 'DEVICE_LINK_ERR', key: '12327ae260fe9431', severity: 'ERROR', timestamp: 1542199782975, title: 'Link went down unexpectedly' }, '62d29fab77bddd7': { eventType: 'DEVICE_LINK_ERR', key: '62d29fab77bddd7', severity: 'ERROR', timestamp: 1542199783055, title: 'Link went down unexpectedly' } },
    result = _.assign(
        { CRITICAL: 0, ERROR: 0, INFO: 0, WARNING: 0 },
        ..._(data)
            .values()
            .groupBy('severity')
            .map(({ length }, key) => ({ [key]: length }))
            .value()
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
0 голосов
/ 22 ноября 2018

Пожалуйста, всегда публикуйте вашу попытку в OP, прежде чем спрашивать, чтобы мы узнали, где вы застряли

Вы можете пройти по объекту, используя for .. of и счетчик приращений, как показано ниже.Нет необходимости в lodash

const events = {
        '12327ae260fe9431': {
          eventType: 'DEVICE_LINK_ERR',
          key: '12327ae260fe9431',
          severity: 'ERROR',
          timestamp: 1542199782975,
          title: 'Link went down unexpectedly',
        },
        '62d29fab77bddd7': {
          eventType: 'DEVICE_LINK_ERR',
          key: '62d29fab77bddd7',
          severity: 'ERROR',
          timestamp: 1542199783055,
          title: 'Link went down unexpectedly',
        },
        '62d29fab77bddd71': {
          eventType: 'DEVICE_LINK_ERR',
          key: '62d29fab77bddd7',
          severity: 'INFO',
          timestamp: 1542199783055,
          title: 'Link went down unexpectedly',
        }
      }

let severityCounts = { CRITICAL: 0, ERROR: 0, INFO: 0, WARNING: 0 }

for(let { severity } of Object.values(events)) {
  severityCounts[severity] = severityCounts[severity] || 0
  severityCounts[severity]++
}

console.log(severityCounts)
...