javascript对十进制数字进行正确排序
好的,我有一段代码,按字母顺序对名字进行排序 然而,代码没有按照我想要的方式处理小数 它以以下方式对名称进行排序(Obv我希望它以数字递增): 它将命令:javascript对十进制数字进行正确排序,javascript,sorting,Javascript,Sorting,好的,我有一段代码,按字母顺序对名字进行排序 然而,代码没有按照我想要的方式处理小数 它以以下方式对名称进行排序(Obv我希望它以数字递增): 它将命令: 苹果-1.0051 苹果-1.1071 苹果-11.1592 苹果-12.0692 苹果-12.1717 苹果-2.0186试试下面的代码: function (x, y) { x=x.myname; y=y.myname; var nameA = x.toLowerCase().split("-")[0],
- 苹果-1.0051
- 苹果-1.1071
- 苹果-11.1592
- 苹果-12.0692
- 苹果-12.1717
- 苹果-2.0186试试下面的代码:
function (x, y) { x=x.myname; y=y.myname; var nameA = x.toLowerCase().split("-")[0], nameB = y.toLowerCase().split("-")[0] if (nameA < nameB) //sort string ascending return -1 if (nameA > nameB) return 1 var floatExtract = /(([1-9][0-9]*\.?[0-9]*)|(\.[0-9]+))([Ee][+-]?[0-9]+)?/; if (floatExtract.test(x) && floatExtract.test(y)) { x = x.match(floatExtract)[1]; y = y.match(floatExtract)[1]; if (!isNaN(parseFloat(x)) && !isNaN(parseFloat(y))) { x = parseInt(x); y = parseInt(y); } return ((x > y) ? 1 : ((x < y) ? -1 : 0)); } return 0; }
它拆分字符串,并与第一部分[在连字符之前]进行简单比较,然后搜索字符串内部的浮点,并在列表中对其进行另一种排序函数(x,y){ x=x.myname; y=y.myname; var nameA=x.toLowerCase().split(“-”[0], nameB=y.toLowerCase().split(“-”[0] if(nameA
nameB)返回1 var浮动提取=/([1-9][0-9]*\.?[0-9]*)(\.[0-9]+)([Ee][+-]?[0-9]+)?/; if(浮动提取试验(x)和浮动提取试验(y)){ x=x.match(flootextract)[1]; y=y.match(flootextract)[1]; 如果(!isNaN(parseFloat(x))和&!isNaN(parseFloat(y))){ x=parseInt(x); y=parseInt(y); } 回报率((x>y)?1:((x
|就像@Steve Wellens在他的评论中建议的那样,我修改了您现有的代码片段,先比较文本部分,然后在出现平局时比较字符串的数字部分,将它们转换为
s。如果您只想按字符串的数字部分对进行排序,那么@extramaster的答案应该对您很有用float
function(a, b){ var parts, textPartA, textPartB, numericPartA, numericPartB; parts = a.split('-'); textPartA = parts[0]; numericPartA = parseFloat(parts[1]); parts = b.split('-'); textPartB = parts[0]; numericPartB = parseFloat(parts[1]); //sort by text first if(textPartA < textPartB) { return -1; } if(textPartA > textPartB) { return 1; } //text parts are equal, now sort by the numeric parts if(numericPartA < numericPartB){ return -1; } if(numericPartA > numericPartB){ return 1; } return 0; }
@乔尼:以下是来源+小解释:功能(a、b){ 变量部分,textPartA,textPartB,numericPartA,numericPartB; 部分=a.分割('-'); textPartA=零件[0]; numericPartA=parseFloat(parts[1]); 部分=b.分割('-'); textPartB=零件[0]; numericPartB=parseFloat(parts[1]); //先按文本排序 如果(textPartA
textPartB){ 返回1; } //文本部分相等,现在按数字部分排序 如果(数字部分A<数字部分B){ 返回-1; } 如果(数字零件A>数字零件B){ 返回1; } 返回0; } function fruit_sort(a, b) { var parts = { a: a.split('-'), b: b.split('-') }; if (parts.a[0] == parts.b[0]) // strings are the same return parseFloat(parts.a[1]) - parseFloat(parts.b[1]); // sort by number return parts.a[0] > parts.b[0] ? 1 : -1; // sort by string } var arr = ["APPLE - 1.0051", "APPLE - 1.1071", "APPLE - 11.1592", "APPLE - 12.0692", "BANANA - 1.0051", "BANANA - 1.1071", "BANANA - 11.1592", "BANANA - 12.0692", "BANANA - 12.1717", "APPLE - 12.1717", "APPLE - 2.0186", "APPLE - 21.1407", "BANANA - 23.069", "APPLE - 22.089", "APPLE - 23.069", "BANANA - 2.0186", "BANANA - 21.1407", "BANANA - 22.089"]; arr.sort(fruit_sort); console.log(arr); // outputs [ "APPLE - 1.0051", "APPLE - 1.1071", "APPLE - 2.0186", "APPLE - 11.1592", "APPLE - 12.0692", "APPLE - 12.1717", "APPLE - 21.1407", "APPLE - 22.089", "APPLE - 23.069", "BANANA - 1.0051", "BANANA - 1.1071", "BANANA - 2.0186", "BANANA - 11.1592", "BANANA - 12.0692", "BANANA - 12.1717", "BANANA - 21.1407", "BANANA - 22.089", "BANANA - 23.069" ]
首先,该函数将术语拆分为文本和数字部分——如果文本为偶数,则仅根据数值的parseFloat值进行排序——否则,它将首先根据字符串值进行排序 Ok我使用了rlemon的代码示例并将其编辑为以下内容:function(a, b) { var parts = { a: a.myname.split(' - '), b: b.myname.split(' - ') }; if (parts.a[0] == parts.b[0]) // strings are the same return parseFloat(parts.a[1]) - parseFloat(parts.b[1]); // sort by number return parts.a[0] > parts.b[0] ? 1 : -1; // sort by string
}另一页上有一个类似的解决方案:
其思想是先按字符串排序,然后按数字排序。现在您正在按文本字符串排序(ascii排序)。您可以在数字:01.0001上放置前导零,或者必须将数字从字符串中拆分出来,转换它们,然后按两个字段进行排序。这似乎只按数字部分进行排序:SUpdated answer,是否需要*.myname作为要排序的字符串?好的,我已经尝试了此代码,但它仍然以相同的方式对其进行排序。*.myname是要排序的字符串,格式为“Apple-1.0051”等ok I get和error“match(…).1为空或不是包含匹配检测的objectUpdated答案。我似乎无法使此代码正常工作:S您能提供演示吗?感谢您迄今为止的帮助。添加了一个示例。您能否向我提供一些详细信息,以说明您“似乎无法使此代码正常工作”的原因。“你有错误吗?意外结果?我收到一个错误,说对象不支持此属性或方法。啊,我想我现在看到了。函数变量
和a
不是字符串,而是对象。拆分部分应该写为:b
而不是a.myname.split('-')
。我通过将其稍微更改为以下内容来实现这一点:a.split('-')
函数(a,b){var parts={a:a.myname.split('-'),b:b.myname.split('-')};if(parts.a[0]==parts.b[0])//字符串是相同的返回parseFloat(parts.a[1])-parseFloat(parts.b[1]);//按数字排序返回parts.a[0]>parts.b[0]?1:-1;//按字符串排序}code
function(a, b) { var parts = { a: a.myname.split(' - '), b: b.myname.split(' - ') }; if (parts.a[0] == parts.b[0]) // strings are the same return parseFloat(parts.a[1]) - parseFloat(parts.b[1]); // sort by number return parts.a[0] > parts.b[0] ? 1 : -1; // sort by string