我有一个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
}
}
}
}
任何想法? 反应器上是否有任何插件或组件也是有用的 谢谢你的帮助
答案 0 :(得分:1)
您可以使用mapValues()遍历所有年份和月份。使用map()从地图获取所有measures
,reduce()设置每种度量类型的总和,然后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;