【问题标题】:How do I calculate the number of the key of a specific property from a JSON object如何从 JSON 对象计算特定属性的键数
【发布时间】:2019-04-24 20:34:39
【问题描述】:

图片我有一个

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。我该怎么做呢?

【问题讨论】:

  • 发布的问题似乎根本没有包含any attempt 来解决问题。 StackOverflow 期待您 try to solve your own problem first,因为您的尝试有助于我们更好地了解您想要什么。请编辑问题以显示您尝试过的内容,以说明您遇到minimal reproducible example 的特定障碍。欲了解更多信息,请参阅How to Ask 并拨打tour
  • 从小处着手...首先弄清楚如何遍历对象并访问每个severity。一旦你到达那里,为该类型的计数器添加 1 是相当容易的

标签: javascript json oop ecmascript-6 frontend


【解决方案1】:

您可以按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>

【讨论】:

    【解决方案2】:

    您可以使用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);

    【讨论】:

      【解决方案3】:

      请务必在询问之前将您的尝试发布在 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)

      【讨论】:

        猜你喜欢
        • 2016-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-04
        • 1970-01-01
        • 2021-12-10
        • 2022-01-18
        相关资源
        最近更新 更多