Javascript 如何在node js中同时对日期和各个日期的值数组进行排序?

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 },

我有一个用例,我将得到多个变量每天的平均数据。日期和值以未排序的方式以2个数组返回。我需要按照升序对日期和值数组中的排序值进行排序。根据日期,我现在得到的值是正确的。但我无法对这两个数组进行正确排序。i、 例如,如果我尝试对dates数组进行排序,则无法获得特定日期的值。有没有解决这个问题的办法

代码片段是


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循环中返回。每次循环迭代时,它都返回一个值数组。这种情况下的解决方案是什么?