Javascript从数组中按顺序排列生日
我下面有这个Javascript,我知道可能有更好的方法来完成我所做的,所以如果你想分享一个更好的方法,请这样做,我一定会使用它Javascript从数组中按顺序排列生日,javascript,arrays,sorting,Javascript,Arrays,Sorting,我下面有这个Javascript,我知道可能有更好的方法来完成我所做的,所以如果你想分享一个更好的方法,请这样做,我一定会使用它 var Apeople = ["bob", "joe", "jane", "mike", "henry", "alex"]; var Abdays = ["08/20", "01/23", "04/19", "08/16", "01/08", "04/02"]; 阿佩尔和阿卜戴斯排成一行,所以简的生日是4月19日 我知道我不应该使用eval,所以如果你知道更好的方法
var Apeople = ["bob", "joe", "jane", "mike", "henry", "alex"];
var Abdays = ["08/20", "01/23", "04/19", "08/16", "01/08", "04/02"];
阿佩尔和阿卜戴斯排成一行,所以简的生日是4月19日
我知道我不应该使用eval,所以如果你知道更好的方法,请告诉我
var mnths = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
for(i=0; i<mnths.length; i++){
eval("var "+mnths[i]+" = []");
}
for(i=0; i<Abdays.length; i++){
var ab = Abdays[i];
if(ab.substring(0,1) == "0"){
var mn = ab.substring(1,2); //month number without 0 before it
} else {
var mn = ab.substring(0,2); //month number if 11 or 12
}
eval(""+mnths[mn-1]+".push(i)");
}
现在我有一月=[1,4]四月=[2,5]八月=[0,3]。我这样做是为了找出谁的名字和什么生日相符
例如,Apeoples[一月[0]]将是joe,Abdays[一月[0]]将是01/23
我需要做的是把每个月的条目按照哪个先到哪个先过生日的顺序排列。Abdays[1月[0]]是01/23,但Abdays[1月[1]]是01/08,因此它们应该互换
当我输入这个时,我想我可能应该使用JSON
因此,我需要的帮助是将生日按顺序排列,同时仍然能够分辨哪个生日对应哪个名字,同时可能找到编写此代码的更好方法。您可以像这样对bdays数组进行排序
Abdays = Abdays.sort(function(a, b){
var d1 = new Date(a + " 2010");
var d2 = new Date(b + " 2010");
return d1 > d2;
});
我随机选择了2010年。您将不得不修改它,如果需要,添加更多的条件,并编写代码根据排序的日期对Apeople进行排序
更新:
写得很快。你可以找到更好的方法,但希望这能有所帮助
var map = {};
for(var i=0 ; i < Apeople.length; i++){
map[Abdays[i]] = Apeople[i];
}
Abdays = Abdays.sort(function(a, b){
var d1 = new Date(a + " 2010");
var d2 = new Date(b + " 2010");
return d1 > d2;
});
for(var i=0 ; i < Apeople.length; i++){
Apeople[i] = map[Abdays[i]];
}
console.log(Apeople, Abdays);
您可以像这样对ADDAYS数组进行排序
Abdays = Abdays.sort(function(a, b){
var d1 = new Date(a + " 2010");
var d2 = new Date(b + " 2010");
return d1 > d2;
});
我随机选择了2010年。您将不得不修改它,如果需要,添加更多的条件,并编写代码根据排序的日期对Apeople进行排序
更新:
写得很快。你可以找到更好的方法,但希望这能有所帮助
var map = {};
for(var i=0 ; i < Apeople.length; i++){
map[Abdays[i]] = Apeople[i];
}
Abdays = Abdays.sort(function(a, b){
var d1 = new Date(a + " 2010");
var d2 = new Date(b + " 2010");
return d1 > d2;
});
for(var i=0 ; i < Apeople.length; i++){
Apeople[i] = map[Abdays[i]];
}
console.log(Apeople, Abdays);
另一种方法。这使用了自定义排序函数
var birthdays = [];
birthdays[0] = { "name": "Bob", "month": 8, "day": 1 };
birthdays[1] = { "name": "John", "month": 4, "day": 2 };
birthdays[2] = { "name": "Jane", "month": 1, "day": 15 };
birthdays.sort( function( a, b ) {
if(a["month"] < b["month"] ) return -1;
if(a["month"] > b["month"] ) return 1;
if( a["day"] < b["day"] ) return -1;
if( a["day"] > b["day"] ) return 1;
return 0; //they are the same
});
附加的优点是,您可以根据需要修改排序功能。另一种方法。这使用了自定义排序函数
var birthdays = [];
birthdays[0] = { "name": "Bob", "month": 8, "day": 1 };
birthdays[1] = { "name": "John", "month": 4, "day": 2 };
birthdays[2] = { "name": "Jane", "month": 1, "day": 15 };
birthdays.sort( function( a, b ) {
if(a["month"] < b["month"] ) return -1;
if(a["month"] > b["month"] ) return 1;
if( a["day"] < b["day"] ) return -1;
if( a["day"] > b["day"] ) return 1;
return 0; //they are the same
});
附加的优点是,您可以修改排序函数以满足您的需要。如果您将这些mm/dd值转换为本机JS时间戳,您只需在JS中使用标准数组排序调用即可将它们按顺序排列。实际上,你有很多额外的无意义的工作要做,因为你没有利用本机的功能。顺便说一句:你的eval不是util。不要用eval来做那件事。mnths[mn-1]。普希将完成全部工作。在大多数情况下,可以而且必须避免eval。你不需要做evalvar+mnths[i]+=[];你在这里混合了数组和对象…@MarcB是的,但是如果我只对生日进行排序,我就不知道每个生日的名字了,因为它们不会排成一行。@dievardump所以如果我在eval+mnth[mn-1]+中去掉eval的话;只要做mnths[mn-1]。普希我也可以摆脱第一次评估,对吗?编辑:我试着只做mnth[mn-1]。push并得到错误错误:TypeError:mnth[mn-1]。push不是一个函数。顺便说一句,ab.substring0,1可以用ab.charAt0替换。如果您将这些mm/dd值转换为本机JS时间戳,只需在JS中使用标准数组排序调用即可。实际上,你有很多额外的无意义的工作要做,因为你没有利用本机的功能。顺便说一句:你的eval不是util。不要用eval来做那件事。mnths[mn-1]。普希将完成全部工作。在大多数情况下,可以而且必须避免eval。你不需要做evalvar+mnths[i]+=[];你在这里混合了数组和对象…@MarcB是的,但是如果我只对生日进行排序,我就不知道每个生日的名字了,因为它们不会排成一行。@dievardump所以如果我在eval+mnth[mn-1]+中去掉eval的话;只要做mnths[mn-1]。普希我也可以摆脱第一次评估,对吗?编辑:我尝试只执行mnth[mn-1]。push并获取错误错误:TypeError:mnth[mn-1]。push不是函数BTW,ab.substring0,1可以替换为ab.charAt0。是的。这是最好的办法。然后,您可以像这样轻松地对数组排序,维护名称-日期关系。是的。这很好用,但是我如何根据已排序的日期对人员进行排序?是的。这是最好的办法。然后,您可以像这样轻松地对数组排序,维护名称-日期关系。是的。这很好用,但是我该如何根据已排序的日期对人员进行排序?这看起来也很棒。在这两个答案之间,我应该能找到答案。谢谢这看起来也很棒。在这两个答案之间,我应该能找到答案。谢谢