我有以下数据用于统计数据。
这是输入数据:
data=[
{ date: '2018-01-08',
assignment: 'java',
count: 2 },
{ date: '2018-01-04',
assignment: 'java',
count: 3 },
{ date: '2018-01-04',
assignment: 'javaScript',
count: 2 },
{ date: '2017-12-18',
assignment: 'java',
count: 2 },
{ date: '2017-11-24',
assignment: 'java',
count: 2 },
{ date: '2018-01-02',
assignment: 'javaScript',
count: 2 },....]
我的尝试:
let dataColln = data.map((e)=>{
let obj = {};
obj.date = e.date;
obj[e.assignment] = e.count;
return obj;
});
这是预期的输出:
[{
date:2018-01-08,
java: 2
},
{
date:2018-01-04,
java: 3,
javaScript: 2
},
{
date:2018-01-02,
javaScript: 2
},...]
如何使用javaScript forEach
或reduce
方法实现上述格式?
我能够获得分配给该名称的计数。
我还在lodash中尝试了groupBy
和uniqBy
方法。
答案 0 :(得分:0)
您可以使用Map
来收集值,并通过获取值来渲染结果。
此提案的功能
Array#forEach
用于迭代给定数据,
一个destructuring assignment,用于将对象的属性作为变量获取,
Object.assign
,其中包含一个默认对象,用于为对象分配short hand properties和computed property names的单个属性。
稍后使用spread syntax ...
获取地图的值。
var data = [{ date: '2018-01-08', assignment: 'java', count: 2 }, { date: '2018-01-04', assignment: 'java', count: 3 }, { date: '2018-01-04', assignment: 'javaScript', count: 2 }, { date: '2017-12-18', assignment: 'java', count: 2 }, { date: '2017-11-24', assignment: 'java', count: 2 }, { date: '2018-01-02', assignment: 'javaScript', count: 2 }],
map = new Map,
result;
data.forEach(({ date, assignment, count }) =>
map.set(date, Object.assign(map.get(date) || { date }, { [assignment]: count }))
);
result = [...map.values()]
console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }