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