格式化Json,删除重复项并计算javascript中的元素
我有点迷路了,我有一个json格式的数据集,带有时间戳和ID,如下所示:格式化Json,删除重复项并计算javascript中的元素,javascript,angularjs,json,Javascript,Angularjs,Json,我有点迷路了,我有一个json格式的数据集,带有时间戳和ID,如下所示: [{ "date":"2016-11-18 19:20:42","id_pa":"7" },{ "date":"2016-11-18 19:04:55","id_pa":"5" },{ "date":"2016-11-19 20:53:42","id_pa":"7" },{ "date":"2016-11-19 20:53:43","id_pa":"7" },{ "date":"2016-11-19 2
[{
"date":"2016-11-18 19:20:42","id_pa":"7"
},{
"date":"2016-11-18 19:04:55","id_pa":"5"
},{
"date":"2016-11-19 20:53:42","id_pa":"7"
},{
"date":"2016-11-19 20:53:43","id_pa":"7"
},{
"date":"2016-11-19 20:53:43","id_pa":"7"
},{
"date":"2016-11-20 20:49:42","id_pa":"7"
},{
"date":"2016-11-20 20:50:45","id_pa":"7"
},{
"date":"2016-11-20 20:50:46","id_pa":"7"
}]
[{
"date":"18-11-2016","num_pa":"2"
},{
"date":"19-11-2016","num_pa":"1"
},{
"date":"20-11-2016","num_pa":"1"
}]
我想构建一个json,显示每天的日期和ID数量。新的Json如下所示:
[{
"date":"2016-11-18 19:20:42","id_pa":"7"
},{
"date":"2016-11-18 19:04:55","id_pa":"5"
},{
"date":"2016-11-19 20:53:42","id_pa":"7"
},{
"date":"2016-11-19 20:53:43","id_pa":"7"
},{
"date":"2016-11-19 20:53:43","id_pa":"7"
},{
"date":"2016-11-20 20:49:42","id_pa":"7"
},{
"date":"2016-11-20 20:50:45","id_pa":"7"
},{
"date":"2016-11-20 20:50:46","id_pa":"7"
}]
[{
"date":"18-11-2016","num_pa":"2"
},{
"date":"19-11-2016","num_pa":"1"
},{
"date":"20-11-2016","num_pa":"1"
}]
我想我必须做一个.map来格式化日期,使其显示dd-mm-yyyy,然后做一个.filter来删除重复项,最后做一个.reduce来计算每个日期的不同ID。到目前为止,我只完成了.map过程,但我不确定如何执行下一步,我的解决方案是否是最佳解决方案
这是我的一段代码:
SwapSvc
.getUsage (vm.id_fi)
.then((data)=>{
//console.log(`lreceived data: `+ JSON.stringify(data) );
vm.fdata = data.map((elem) => {
//console.log(`date: ${elem.date}`);
//console.log(`id_pa: ${elem.id_pa}`);
var d = new Date (elem.date);
return{
date:d.getDate()+'-'+d.getMonth()+'-'+d.getFullYear()/*elem.date*/,
id_pa:elem.id_pa
}})
var temp = [];
vm.filteredData = vm.fdata.filter((elem, index) => {
if(temp.indexOf(elem.date)<0){
temp.push(elem);
return true;
}
else return false;
});
console.log(`data after parsing and ordering: `+ JSON.stringify(vm.filteredData) );
return data;
})
.catch((err)=>{
//error
console.log(`error, no response`);
throw err;
});
SwapSvc
.getUsage(vm.id\u-fi)
。然后((数据)=>{
//log(`lreceived data:`+JSON.stringify(data));
vm.fdata=data.map((elem)=>{
//log(`date:${elem.date}`);
//log(`id\u pa:${elem.id\u pa}`);
var d=新日期(要素日期);
返回{
日期:d.getDate()+'-'+d.getMonth()+'-'+d.getFullYear()/*元素日期*/,,
id\u pa:elem.id\u pa
}})
var-temp=[];
vm.filteredData=vm.fdata.filter((元素,索引)=>{
if(临时索引)(要素日期){
//错误
log(`error,no response`);
犯错误;
});
PS:我在ES6中使用angular 1.6。
提前谢谢
BRJ您可以使用哈希表作为日期,并收集所有的
id\u pa
以供以后计数
var data=[{date:“2016-11-18 19:20:42”,id_-pa:“7”},{date:“2016-11-18 19:04:55”,id_-pa:“5”},{date:“2016-11-19 20:53:42”,id_-pa:“7”},{date date date 2016-11-19 20:53:43,id_-pa:“7”{date date date 2016-11-11-20:49:42,id_-pa:“date 2016-11-20:45,{“2016-11-20 20:50:46”,同上:“7”},
hash=Object.create(null),
结果;
data.forEach(函数(a){
var-date=a.date.slice(0,10);
hash[date]=hash[date]| | Object.create(null);
hash[date][a.id\u pa]=true;
});
result=Object.keys(hash.map)(date=>({date,num_pa:Object.keys(hash[date]).length}));
console.log(结果);
。作为控制台包装{max height:100%!important;top:0;}
您可以使用哈希表作为日期,并收集所有id\u pa
供以后计数
var data=[{date:“2016-11-18 19:20:42”,id_pa:“7”},{date:“2016-11-18 19:04:55”,id_pa:“5”},{date:“2016-11-19 20:53:42”,id_pa:“7”},{date date date:“2016-11-19 20:53:43”,id_pa:“7”{date date date 2016-11-11-20:49:42,id_pa:“date 7:20:45,{2016-11-20 20:50:46“,同上:“7”},
hash=Object.create(null),
结果;
data.forEach(函数(a){
var-date=a.date.slice(0,10);
hash[date]=hash[date]| | Object.create(null);
hash[date][a.id\u pa]=true;
});
result=Object.keys(hash.map)(date=>({date,num_pa:Object.keys(hash[date]).length}));
console.log(结果);
.as console wrapper{max height:100%!important;top:0;}
您可以将reduce
链接到map
调用中,并使用ES6findIndex
方法查看对象当前是否存在于reduce
函数创建的数组中
SwapSvc
.getUsage (vm.id_fi)
.then((data)=>{
//console.log(`lreceived data: `+ JSON.stringify(data) );
vm.fdata = data.map((elem) => {
//console.log(`date: ${elem.date}`);
//console.log(`id_pa: ${elem.id_pa}`);
var d = new Date (elem.date);
return{
date:d.getDate()+'-'+d.getMonth()+'-'+d.getFullYear()/*elem.date*/,
id_pa:elem.id_pa
}}).reduce((p, c, i) => {
var index = p.findIndex(x => x.date === c.date);
if (index !== -1) p[index].num_pa++;
else p.push({"date": c.date, "num_pa": 1})
return p;
}, [])
console.log(`data after parsing and ordering: `+ JSON.stringify(vm.fData) );
return data;
})
您只需将
reduce
链接到map
调用中,并使用ES6findIndex
方法查看对象当前是否存在于由reduce
函数创建的数组中
SwapSvc
.getUsage (vm.id_fi)
.then((data)=>{
//console.log(`lreceived data: `+ JSON.stringify(data) );
vm.fdata = data.map((elem) => {
//console.log(`date: ${elem.date}`);
//console.log(`id_pa: ${elem.id_pa}`);
var d = new Date (elem.date);
return{
date:d.getDate()+'-'+d.getMonth()+'-'+d.getFullYear()/*elem.date*/,
id_pa:elem.id_pa
}}).reduce((p, c, i) => {
var index = p.findIndex(x => x.date === c.date);
if (index !== -1) p[index].num_pa++;
else p.push({"date": c.date, "num_pa": 1})
return p;
}, [])
console.log(`data after parsing and ordering: `+ JSON.stringify(vm.fData) );
return data;
})
您是尝试从函数返回修改后的数据还是将其记录到控制台?首先,我想将其记录到控制台进行测试,但之后我想将数据显示在图形中。您是尝试从函数返回修改后的数据还是将其记录到控制台?首先,我想将其记录到控制台进行测试,但之后我想在图表中显示数据。谢谢它像一个符咒一样工作,这正是我在寻找的。谢谢它像一个符咒一样工作,这正是我在寻找的。谢谢它工作得很好,我会在将来考虑这个解决方案。谢谢它工作得很好,我以后会考虑这个解决方案。