合并 json 个数据的值

merge value of json data

我有一个 reactjs 应用程序,我需要使用 json 过滤数据,根据时间戳,我已经按年过滤日期,然后按月过滤,现在我需要将其值相加到个月。我用 lodash 尝试了一些功能但成功了

现在这是我的 json 文件

'2016':{
  'jan':{
    '0':{
        'measures':{
        'step':{
          'text': 'step',
          'unit': 123
        },
        'calories':{
          'text': 'cal',
          'unit': 321
        }
      }
    },
    '1':{
      'measures':{
        'step':{
          'text': 'step',
          'unit': 45
        },
        'calories':{
          'text': 'cal',
          'unit': 65
        }
      }
    }
  },
  'feb':{
    '0':{
        'measures':{
        'step':{
          'text': 'step',
          'unit': 98
        },
        'calories':{
          'text': 'cal',
          'unit': 78
        }
      }
    },
    '1':{
      'measures':{
        'step':{
          'text': 'step',
          'unit': 21
        },
        'calories':{
          'text': 'cal',
          'unit': 41
        }
      }
    }
  }
}

我想要这个

'2016':{
  'jan':{
    'measures':{
      'step':{
        'text': 'step',
        'unit': 168 // sum value of measures
      },
      'calories':{
        'text': 'cal',
        'unit': 386
      }
     }
  },
  'feb':{
    'measures':{
      'step':{
        'text': 'step',
        'unit': 119
      },
      'calories':{
        'text': 'cal',
        'unit': 139
      }
    }
  }
}

有什么想法吗? reactjs 上是否有任何插件或组件也很有用 谢谢你的帮助

您可以使用 mapValues() for the traversing all years and months. Use map() to obtain all measures from maps, reduce() to set the sum for each measure types and then thru() 到 return measures 对象签名。

var result = _.mapValues(years, months => {
  return _.mapValues(months, month => {
    return _.chain(month)
      .map()
      .map('measures')
      .reduce((measures, measureTypes) => {
        return _.reduce(measureTypes, (result, measureType, type) => {
          if (result[type]) {
            result[type].unit += measureType.unit;
          } else {
            result[type] = measureType;
          }
          return result;
        }, measures);
      }, {})
      .thru(measures => ({ measures }))
      .value();
  });
});

var years = {
  '2016': {
    'jan': {
      '0': {
        'measures': {
          'step': {
            'text': 'step',
            'unit': 123
          },
          'calories': {
            'text': 'cal',
            'unit': 321
          }
        }
      },
      '1': {
        'measures': {
          'step': {
            'text': 'step',
            'unit': 45
          },
          'calories': {
            'text': 'cal',
            'unit': 65
          }
        }
      }
    },
    'feb': {
      '0': {
        'measures': {
          'step': {
            'text': 'step',
            'unit': 98
          },
          'calories': {
            'text': 'cal',
            'unit': 78
          }
        }
      },
      '1': {
        'measures': {
          'step': {
            'text': 'step',
            'unit': 21
          },
          'calories': {
            'text': 'cal',
            'unit': 41
          }
        }
      }
    }
  }
};

var result = _.mapValues(years, months => {
  return _.mapValues(months, month => {
    return _.chain(month)
      .map()
      .map('measures')
      .reduce((measures, measureTypes) => {
        return _.reduce(measureTypes, (result, measureType, type) => {
          if (result[type]) {
            result[type].unit += measureType.unit;
          } else {
            result[type] = measureType;
          }
          return result;
        }, measures);
      }, {})
      .thru(measures => ({ measures }))
      .value();
  });
});

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.js"></script>