Javascript 如何在node js中同时对日期和各个日期的值数组进行排序?
我有一个用例,我将得到多个变量每天的平均数据。日期和值以未排序的方式以2个数组返回。我需要按照升序对日期和值数组中的排序值进行排序。根据日期,我现在得到的值是正确的。但我无法对这两个数组进行正确排序。i、 例如,如果我尝试对dates数组进行排序,则无法获得特定日期的值。有没有解决这个问题的办法 代码片段是Javascript 如何在node js中同时对日期和各个日期的值数组进行排序?,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我有一个用例,我将得到多个变量每天的平均数据。日期和值以未排序的方式以2个数组返回。我需要按照升序对日期和值数组中的排序值进行排序。根据日期,我现在得到的值是正确的。但我无法对这两个数组进行正确排序。i、 例如,如果我尝试对dates数组进行排序,则无法获得特定日期的值。有没有解决这个问题的办法 代码片段是 let avgValue = [ { _id: { year: 2019, month: 12, day: 11 }, value: 19.83 },
let avgValue = [ { _id: { year: 2019, month: 12, day: 11 }, value: 19.83 },
{ _id: { year: 2019, month: 12, day: 10 }, value: 17.88 },
{ _id: { year: 2019, month: 12, day: 9 }, value: 32.58 },
{ _id: { year: 2019, month: 12, day: 6 }, value: 1 },
{ _id: { year: 2019, month: 12, day: 5 }, value: 33.82 } ];
[ { _id: { year: 2019, month: 12, day: 11 }, value: 26 },
{ _id: { year: 2019, month: 12, day: 10 }, value: 40.38 },
{ _id: { year: 2019, month: 12, day: 9 }, value: 35.2 },
{ _id: { year: 2019, month: 12, day: 6 }, value: 2 },
{ _id: { year: 2019, month: 12, day: 5 }, value: 38.91 } ];
**avgValue is a mongodb query which returns the above array for every variable**
let dates = [ '11/12/2019','10/12/2019','9/12/2019','8/12/2019',
'7/12/2019','6/12/2019','5/12/2019','4/12/2019'];
let dbValues=[],dbDates=[],concatenatedDate,newdates=[],constArray=[];
let avgDates = avgValue.map((date,i)=>(date._id.year&&date._id.month&&date._id.day)?
constArray.push(date._id.day+"/"+date._id.month+"/"+date._id.year):null);
avgValue.forEach(async data=>{
concatenatedDate = data._id.day+"/"+data._id.month+"/"+data._id.year;
dates.map((newDate,j)=>{
if(!constArray.includes(newDate) && !newdates.includes(newDate) && i==j){
dbValues.push(0);
newdates.push(newDate);
}else if(newDate===concatenatedDate ){
dbValues.push(data.value);
}
});
dbDates.push(newdates);
}
预计产量为
值:[0,77,1,0,0200,15,22]
标签:[2019年12月4日,2019年12月5日,
6/12/2019,
7/12/2019,
8/12/2019,
9/12/2019,
10/12/2019,
2019年12月11日]
这不是最快的方法,但如果您不想实现排序算法,可以合并、排序和取消合并数组
const values = [22,0,0,15,200,1,77]
const labels = ["11/12/2019","9/12/2019","7/12/2019","10/12/2019","9/12/2019","6/12/2019","5/12/2019"];
// merge
const merged = [];
for (let i = 0; i < values.length; ++i) {
merged.push([values[i], labels[i]]);
}
// sort
merged.sort((a,b) => new Date(a[1]).getTime() - new Date(b[1]).getTime());
// unmerge
const resValues = [];
const resLabels = [];
for (const mergedValue of merged) {
resValues.push(mergedValue[0]);
resLabels.push(mergedValue[1]);
}
// log
// resValues: [ 77, 1, 0, 0, 200, 15, 22 ]
// resLabels: [ '5/12/2019',
// '6/12/2019',
// '7/12/2019',
// '9/12/2019',
// '9/12/2019',
// '10/12/2019',
// '11/12/2019',
// ]
const值=[22,0,0,15200,1,77]
施工标签=[“2019年11月12日”、“2019年9月12日”、“2019年7月12日”、“2019年10月12日”、“2019年9月12日”、“2019年6月12日”、“2019年5月12日”];
//合并
const merged=[];
for(设i=0;i新日期(a[1]).getTime()-新日期(b[1]).getTime());
//未合并
常量resValues=[];
常量resLabels=[];
for(const merged合并的值){
resValues.push(mergedValue[0]);
resLabels.push(mergedValue[1]);
}
//日志
//resValues:[77,1,0,0200,15,22]
//重新标签:['5/12/2019',
// '6/12/2019',
// '7/12/2019',
// '9/12/2019',
// '9/12/2019',
// '10/12/2019',
// '11/12/2019',
// ]
我认为没有直接的方法可以实现这一点。因为除了索引之外,值和标签不直接映射
我建议的一种方法是提取两个数组,并创建一个包含值和标签的对象数组([{value,label}]
)。然后将其排序并重新分配给对象。
我在下面附上了一个链接,介绍了如何做到这一点。(可能不是最快的)
另一种方法是重新构造原始对象,使其具有适当的对象数组,而不是如上所述的不同数组值,以便可以轻松排序
您是否使用提供的排序方法,并且没有重复的值?然后,您可以创建一个映射,将每个日期链接到其对应的值,然后对日期数组进行排序,最后对其进行迭代,以检索每个排序日期的值,然后将其放置在另一个数组中的正确位置。感谢您的帮助。但您的解决方案适用于单值数组。但是我得到了多个变量的多个数组。这些数组将在for循环中返回。每次循环迭代时,它都返回一个值数组。这种情况下的解决方案是什么?