以特定格式对 json 数据进行分组
grouping json data in a specific format
我的基础数据如下..
[{
month: 'Jan',
cat: 'A',
val: 20
},{
month: 'Jan',
cat: 'B','
val: 5
},{
month: 'Jan',
cat: 'C',
val: 10
},{
month: 'Feb',
cat: 'A',
val: 30
},{
month: 'Feb',
cat: 'B',
val: 10
},{
month: 'Feb',
cat: 'C',
val: 20
}];
我需要使用 javascript 最好是 lodash..
将其转换为以下内容
[{
selectedmonth: 'Jan',
data:[{
mycat: 'A',
myval: 20
},{
mycat: 'B',
myval: 5
},{
mycat: 'C',
myval: 10
}
]
}, {
selectedmonth: 'Feb',
data:[{
mycat: 'A',
myval: 30
},{
mycat: 'B',
myval: 10
},{
mycat: 'C',
myval: 20
}
]
}]
我了解 lodash groupby - month 调用会执行 groupby 但它以不同的格式执行..
真诚感谢任何帮助..
您可以使用对象作为哈希表来引用结果数组。
var array = [{ month: 'Jan', cat: 'A', val: 20 }, { month: 'Jan', cat: 'B', val: 5 }, { month: 'Jan', cat: 'C', val: 10 }, { month: 'Feb', cat: 'A', val: 30 }, { month: 'Feb', cat: 'B', val: 10 }, { month: 'Feb', cat: 'C', val: 20 }],
grouped = [];
array.forEach(function (a) {
if (!this[a.month]) {
this[a.month] = { selectedmonth: a.month, data: [] };
grouped.push(this[a.month]);
}
this[a.month].data.push({ mycat: a.cat, myval: a.val });
}, Object.create(null));
console.log(grouped);
如果您使用的是 lodash,则可以使用 groupBy() to group items by month
and then use map() 根据您的条件转换项目。
var result = _(collection)
.map(v => _.mapKeys(v, (v, k) => 'my' + k))
.groupBy('mymonth')
.map((data, selectedmonth) => ({
selectedmonth,
data: _.map(data, item => _.omit(item, 'mymonth'))
})).value();
var collection = [{
month: 'Jan',
cat: 'A',
val: 20
}, {
month: 'Jan',
cat: 'B',
val: 5
}, {
month: 'Jan',
cat: 'C',
val: 10
}, {
month: 'Feb',
cat: 'A',
val: 30
}, {
month: 'Feb',
cat: 'B',
val: 10
}, {
month: 'Feb',
cat: 'C',
val: 20
}];
var result = _(collection)
.map(v => _.mapKeys(v, (v, k) => 'my' + k))
.groupBy('mymonth')
.map((data, selectedmonth) => ({
selectedmonth,
data: _.map(data, item => _.omit(item, 'mymonth'))
})).value();
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.js"></script>
我的基础数据如下..
[{
month: 'Jan',
cat: 'A',
val: 20
},{
month: 'Jan',
cat: 'B','
val: 5
},{
month: 'Jan',
cat: 'C',
val: 10
},{
month: 'Feb',
cat: 'A',
val: 30
},{
month: 'Feb',
cat: 'B',
val: 10
},{
month: 'Feb',
cat: 'C',
val: 20
}];
我需要使用 javascript 最好是 lodash..
将其转换为以下内容 [{
selectedmonth: 'Jan',
data:[{
mycat: 'A',
myval: 20
},{
mycat: 'B',
myval: 5
},{
mycat: 'C',
myval: 10
}
]
}, {
selectedmonth: 'Feb',
data:[{
mycat: 'A',
myval: 30
},{
mycat: 'B',
myval: 10
},{
mycat: 'C',
myval: 20
}
]
}]
我了解 lodash groupby - month 调用会执行 groupby 但它以不同的格式执行..
真诚感谢任何帮助..
您可以使用对象作为哈希表来引用结果数组。
var array = [{ month: 'Jan', cat: 'A', val: 20 }, { month: 'Jan', cat: 'B', val: 5 }, { month: 'Jan', cat: 'C', val: 10 }, { month: 'Feb', cat: 'A', val: 30 }, { month: 'Feb', cat: 'B', val: 10 }, { month: 'Feb', cat: 'C', val: 20 }],
grouped = [];
array.forEach(function (a) {
if (!this[a.month]) {
this[a.month] = { selectedmonth: a.month, data: [] };
grouped.push(this[a.month]);
}
this[a.month].data.push({ mycat: a.cat, myval: a.val });
}, Object.create(null));
console.log(grouped);
如果您使用的是 lodash,则可以使用 groupBy() to group items by month
and then use map() 根据您的条件转换项目。
var result = _(collection)
.map(v => _.mapKeys(v, (v, k) => 'my' + k))
.groupBy('mymonth')
.map((data, selectedmonth) => ({
selectedmonth,
data: _.map(data, item => _.omit(item, 'mymonth'))
})).value();
var collection = [{
month: 'Jan',
cat: 'A',
val: 20
}, {
month: 'Jan',
cat: 'B',
val: 5
}, {
month: 'Jan',
cat: 'C',
val: 10
}, {
month: 'Feb',
cat: 'A',
val: 30
}, {
month: 'Feb',
cat: 'B',
val: 10
}, {
month: 'Feb',
cat: 'C',
val: 20
}];
var result = _(collection)
.map(v => _.mapKeys(v, (v, k) => 'my' + k))
.groupBy('mymonth')
.map((data, selectedmonth) => ({
selectedmonth,
data: _.map(data, item => _.omit(item, 'mymonth'))
})).value();
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.js"></script>