Javascript 如何从Ajax响应中将数组数据与日期分组?
我有这样的数组数据Javascript 如何从Ajax响应中将数组数据与日期分组?,javascript,jquery,arrays,ajax,Javascript,Jquery,Arrays,Ajax,我有这样的数组数据 [{ date: "January 2019", sum: 20, name: "Persada", },{ date: "Februay 2019", sum: 21, name: "Persada", },{ date: "April 2019", sum: 22, name: "Persada", },{ date: "January 2019", sum: 10, name: "Khari
[{
date: "January 2019",
sum: 20,
name: "Persada",
},{
date: "Februay 2019",
sum: 21,
name: "Persada",
},{
date: "April 2019",
sum: 22,
name: "Persada",
},{
date: "January 2019",
sum: 10,
name: "Kharisma",
},{
date: "March 2019",
sum: 5,
name: "Kharisma",
},{
date: "Februari 2019",
sum: 4,
name: "Solusindo",
},{
date: "Mai 2019",
sum: 2,
name: "Solusindo",
}]
["January 2019", "February 2019", "March 2019", "April 2019", "Mai 2019"]
[{
date : ["January 2019", "February 2019", "March 2019", "April 2019", "Mai 2019"],
sum: [20, 21, 0, 22, 0],
name: "Persada",
},{
date : ["January 2019", "February 2019", "March 2019", "April 2019", "Mai 2019"],
sum: [0, 0, 10, 5, 0],
name: "Kharisma",
},{
date : ["January 2019", "February 2019", "March 2019", "April 2019", "Mai 2019"],
sum: [0, 4, 0, 0, 2],
name: "Solusindo",
}]
根据以上数据,我选择了一个不同的日期。所以我有这样的约会
[{
date: "January 2019",
sum: 20,
name: "Persada",
},{
date: "Februay 2019",
sum: 21,
name: "Persada",
},{
date: "April 2019",
sum: 22,
name: "Persada",
},{
date: "January 2019",
sum: 10,
name: "Kharisma",
},{
date: "March 2019",
sum: 5,
name: "Kharisma",
},{
date: "Februari 2019",
sum: 4,
name: "Solusindo",
},{
date: "Mai 2019",
sum: 2,
name: "Solusindo",
}]
["January 2019", "February 2019", "March 2019", "April 2019", "Mai 2019"]
[{
date : ["January 2019", "February 2019", "March 2019", "April 2019", "Mai 2019"],
sum: [20, 21, 0, 22, 0],
name: "Persada",
},{
date : ["January 2019", "February 2019", "March 2019", "April 2019", "Mai 2019"],
sum: [0, 0, 10, 5, 0],
name: "Kharisma",
},{
date : ["January 2019", "February 2019", "March 2019", "April 2019", "Mai 2019"],
sum: [0, 4, 0, 0, 2],
name: "Solusindo",
}]
然后我想像这样设置数据
[{
date: "January 2019",
sum: 20,
name: "Persada",
},{
date: "Februay 2019",
sum: 21,
name: "Persada",
},{
date: "April 2019",
sum: 22,
name: "Persada",
},{
date: "January 2019",
sum: 10,
name: "Kharisma",
},{
date: "March 2019",
sum: 5,
name: "Kharisma",
},{
date: "Februari 2019",
sum: 4,
name: "Solusindo",
},{
date: "Mai 2019",
sum: 2,
name: "Solusindo",
}]
["January 2019", "February 2019", "March 2019", "April 2019", "Mai 2019"]
[{
date : ["January 2019", "February 2019", "March 2019", "April 2019", "Mai 2019"],
sum: [20, 21, 0, 22, 0],
name: "Persada",
},{
date : ["January 2019", "February 2019", "March 2019", "April 2019", "Mai 2019"],
sum: [0, 0, 10, 5, 0],
name: "Kharisma",
},{
date : ["January 2019", "February 2019", "March 2019", "April 2019", "Mai 2019"],
sum: [0, 4, 0, 0, 2],
name: "Solusindo",
}]
如果该日期没有数据,则数据总和将自动替换为0。请帮我设置这样的数据。多谢各位
Set
,Array.from
创建初始条目)Object.entries
创建字典表单数组)Array.prototype.reduce
创建一个包含date和sum
的字典,其中name
为键Object.entries
在字典中循环以创建结果集李>
Object.keys
从日期字典中提取日期
Object.values
从日期字典中提取sum
const响应=[{
日期:“2019年1月”,
总数:20,
姓名:“Persada”,
}, {
日期:“2019年2月”,
总数:21,
姓名:“Persada”,
}, {
日期:“2019年4月”,
总数:22,
姓名:“Persada”,
}, {
日期:“2019年1月”,
总数:10,
姓名:“哈利斯马”,
}, {
日期:“2019年3月”,
总数:5,
姓名:“哈利斯马”,
}, {
日期:“2019年2月”,
总数:4,
名称:“Solusindo”,
}, {
日期:“2019年5月”,
总数:2,
名称:“Solusindo”,
}];
const initialValues=Array.from(新集合(response.map(({date})=>date)),date=>[date,0]);
const dictionary=response.reduce((acc{
日期,
总和
名称
}) => {
acc[name]=acc[name]| | Object.fromEntries(初始值);
会计科目[名称][日期]=(会计科目[名称][日期]| 0)+总和;
返回acc;
}, {});
const result=Object.entries(dictionary.map)([name,sumByDate])=>({
日期:Object.keys(sumByDate),
总和:对象值(sumByDate),
名称
}));
控制台日志(结果)代码>
。作为控制台包装器{
最大高度:100vh!重要;
排名:0;
}
1)构建一个具有唯一键的对象,如name
和sum、date、name的值。
2) 使用forEach
循环检查数据,如果键不存在,则将sum
的默认值与数组大小为日期的“0”数组相加。
3) 更新相应的sum
值。
4) 在函数中,将res
的对象值作为数组返回
const update=data=>{
常数日期=[
“2019年1月”,
“2019年2月”,
“2019年3月”,
“2019年4月”,
“2019年5月”
];
//或者,你也可以选择这样的日期
//const dates=[…新集合(data.map(({date}=>date))];
const sums=dates.map(x=>0);
常数res={};
data.forEach({name,sum,date})=>{
如果(!res[name]){
res[name]={date:[…dates],sum:[…sums],name};
}
const index=dates.findIndex(月=>month==date);
如果(索引!=-1){
res[name][“sum”][index]=sum;
}
});
返回Object.values(res);
};
常数数据=[
{
日期:“2019年1月”,
总数:20,
姓名:“Persada”
},
{
日期:“2019年2月”,
总数:21,
姓名:“Persada”
},
{
日期:“2019年4月”,
总数:22,
姓名:“Persada”
},
{
日期:“2019年1月”,
总数:10,
姓名:“哈利斯马”
},
{
日期:“2019年3月”,
总数:5,
姓名:“哈利斯马”
},
{
日期:“2019年2月”,
总数:4,
名称:“Solusindo”
},
{
日期:“2019年5月”,
总数:2,
名称:“Solusindo”
}
];
控制台日志(更新(数据))代码>我发现以正确的格式从服务器/数据库返回数据更有用。