合并json数据的值

时间:2016-05-19 23:10:21

标签: json filter lodash

我有一个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
      }
    }
  }
}

任何想法? 反应器上是否有任何插件或组件也是有用的 谢谢你的帮助

1 个答案:

答案 0 :(得分:1)

您可以使用mapValues()遍历所有年份和月份。使用map()从地图获取所有measuresreduce()设置每种度量类型的总和,然后thru()返回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>');
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.js"></script>
&#13;
&#13;
&#13;