使用函数'对javascript数组进行排序;排序“;
我正在尝试对javascript数组进行排序,该数组包含任何类型的数据,比如数字、字符串、日期、时间等。我的逻辑对除数字以外的所有数据类型都很有效。它将数字视为字符串 例如,我有一个如下所示的数组:使用函数'对javascript数组进行排序;排序“;,javascript,sorting,Javascript,Sorting,我正在尝试对javascript数组进行排序,该数组包含任何类型的数据,比如数字、字符串、日期、时间等。我的逻辑对除数字以外的所有数据类型都很有效。它将数字视为字符串 例如,我有一个如下所示的数组: array = ["1","2","12","22","33","3"] 我希望排序数组是1,2,3,12,22,33…,但它给出了:1,12,2,22,3,33… 任何人都可以改进我的代码,它必须适用于任何类型的数据类型 以下是我的排序代码: function sortTable(a,b){
array = ["1","2","12","22","33","3"]
我希望排序数组是1,2,3,12,22,33…
,但它给出了:1,12,2,22,3,33…
任何人都可以改进我的代码,它必须适用于任何类型的数据类型
以下是我的排序代码:
function sortTable(a,b){
if(sortMode=="A"){
if(a[1]>b[1]) return 1;
if(a[1]<b[1]) return -1;
}
else if( sortMode=="D"){
if(a[1]>b[1]) return -1;
if(a[1]<b[1]) return 1;
}
return 0;
}
array.sort(sortTable);
函数可排序(a,b){
如果(排序模式==“A”){
如果(a[1]>b[1])返回1;
如果(a[1]b[1])返回-1;
如果(a[1]无法获得预期输出的原因是,当两个操作数都是字符串类型时,会按字母顺序对它们进行比较。它们不会自动转换为数字
"2" > "12" // result is true
如果其中一个操作数是数字,则比较运算符将另一个操作数从字符串转换为数字
"2" > 12 // result is false
需要指出的另一点是,在数字数组的情况下,您试图访问索引1处的数组元素
if(a[1]>b[1]) return 1;
这应该是:
if( a > b ) return 1;
我会分别处理每个数据类型,而不是编写这样的泛型函数。无法获得预期输出的原因是,当两个操作数都是字符串类型时,会对它们进行字母顺序比较。它们不会自动转换为数字
"2" > "12" // result is true
如果其中一个操作数是数字,则比较运算符将另一个操作数从字符串转换为数字
"2" > 12 // result is false
需要指出的另一点是,在数字数组的情况下,您试图访问索引1处的数组元素
if(a[1]>b[1]) return 1;
这应该是:
if( a > b ) return 1;
我会分别处理每种数据类型,而不是编写这样一个通用函数。我编写了两个正则表达式条件,用于检查某些数据结构。(您总是可以根据“typeof(a)”或“typeof(b)”是什么来做一个大的switch语句分支。)这些检查确定字符串中的值是否应解释为字符串以外的内容
function sortVals(a,b){
//other code here
var aT=a+"", bT=b+""; //a and b as strings
if(!aT.match(/[^0-9]/) && !bT.match(/[^0-9]/)){//no non-numbers were found
a = parseInt(aT, 10);
b = parseInt(bT, 10);
if(a!=b)
return a<b?1:-1; //returns 1 if a<b; -1 if a>b
}else if(!aT.match(/[^0-9\.]|\..*\./) && !bT.match(/[^0-9\.]|\..*\./)){//only valid floats were found
a = parseFloat(aT);
b = parseFloat(bT);
if(a!=b)
return a<b?1:-1;
}
}
函数排序(a、b){
//这里还有其他代码
var aT=a+“”,bT=b+“”;//a和b作为字符串
如果(!aT.match(/[^0-9]/)和&!bT.match(/[^0-9]/){//未找到非数字
a=parseInt(aT,10);
b=parseInt(bT,10);
如果(a!=b)
返回a我编写了两个正则表达式条件,用于检查某些数据结构。(您总是可以根据“typeof(a)”或“typeof(b)”是什么来生成一个大的switch语句分支。)这些检查确定字符串中的值是否应解释为字符串以外的内容
function sortVals(a,b){
//other code here
var aT=a+"", bT=b+""; //a and b as strings
if(!aT.match(/[^0-9]/) && !bT.match(/[^0-9]/)){//no non-numbers were found
a = parseInt(aT, 10);
b = parseInt(bT, 10);
if(a!=b)
return a<b?1:-1; //returns 1 if a<b; -1 if a>b
}else if(!aT.match(/[^0-9\.]|\..*\./) && !bT.match(/[^0-9\.]|\..*\./)){//only valid floats were found
a = parseFloat(aT);
b = parseFloat(bT);
if(a!=b)
return a<b?1:-1;
}
}
函数排序(a、b){
//这里还有其他代码
var aT=a+“”,bT=b+“”;//a和b作为字符串
如果(!aT.match(/[^0-9]/)和&!bT.match(/[^0-9]/){//未找到非数字
a=parseInt(aT,10);
b=parseInt(bT,10);
如果(a!=b)
返回a正如前面提到的,您需要识别数据类型。但是这里有一个,您可以用于字符串/整数
var sortMethod = function(x,y){
var a = x|0 ,
b = y|0;
return (a>b) ? 1 : -1;
});
var x = ["1", "34" , "3" , "12"].sort(sortMethod);
var y = [3,52,123,1].sort(sortMethod);
如前所述,您需要识别数据类型。但这里有一个,您可以用于字符串/整数
var sortMethod = function(x,y){
var a = x|0 ,
b = y|0;
return (a>b) ? 1 : -1;
});
var x = ["1", "34" , "3" , "12"].sort(sortMethod);
var y = [3,52,123,1].sort(sortMethod);
您不能创建一个像这样处理所有数据类型的排序函数。您必须让它接受一个标志,该标志定义了如何对值进行排序(例如,数字排序、字典排序)可能还有一个转换函数。这不仅仅是精炼代码……如果你只是想让字符串按数字排序,那么就把字符串转换成数字,这里解释如下:我可以把字符串解析成整数……但是如果我的数组是这样的{“印度”、“中国”、“俄罗斯”}。我们可以将这些字符串转换为整数吗?谢谢。。如果数组包含多个数据类型,您知道这些类型应该如何排序吗?也就是说,日期应该在字符串之前,数字应该在日期之前,等等?这样您的数组可以是[“1”、“12”、“2”、“印度”、“中国”]
?排序后您希望它是什么样子?@RamaRaoM您可以编写一个排序函数来检查被排序的值的类型,但这似乎不必要地笨拙,即使这样做,您怎么知道在某些情况下,字符串需要强制为数字?您无法创建一个与所有数据类型都是这样的。您必须让它接受一个标志,该标志定义了如何对值进行排序(例如,数字排序、字典排序)可能还有一个转换函数。这不仅仅是精炼代码……如果你只是想让字符串按数字排序,那么就把字符串转换成数字,这里解释如下:我可以把字符串解析成整数……但是如果我的数组是这样的{“印度”、“中国”、“俄罗斯”}。我们可以将这些字符串转换为整数吗?谢谢。。如果数组包含多个数据类型,您知道这些类型应该如何排序吗?也就是说,日期应该在字符串之前,数字应该在日期之前,等等?这样您的数组可以是[“1”、“12”、“2”、“印度”、“中国”]
?排序后您希望它是什么样子?@ramaroam您可以编写一个排序函数来检查被排序的值的类型,但这似乎不必要地笨拙,即使您这样做,您怎么知道在某些情况下,字符串需要强制成数?