好的我有一段代码可以按字母顺序排列名称。
但是代码不会按照我想要的方式处理小数。
它按以下方式命令名称(Obv我宁愿用数字递增):
它会命令它:
这是我正在使用的代码。我不完全理解代码,因为它是我一直使用的代码片段。
function(a, b){
var nameA=a.myname.toLowerCase(), nameB=b.myname.toLowerCase()
if (nameA < nameB) //sort string ascending
return -1
if (nameA > nameB)
return 1
return 0 //default return value (no sorting)
}
此致 强尼
答案 0 :(得分:3)
Demo这里是源+小解释:
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值进行排序 - 否则它首先按字符串值排序。
答案 1 :(得分:2)
试试这段代码:
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;
}
它会拆分你的字符串并与第一部分[连字符之前]进行简单的比较,然后在你的字符串中搜索一个浮点数,并在列表中对其进行另一种排序......
答案 2 :(得分:2)
就像@Steve Wellens在评论中建议的那样,我修改了你现有的片段,首先比较文本部分,然后在比较字符串的数字部分时将它们转换为float
s。如果你想用字符串的数字部分单独排序,那么@extramaster的答案应该对你有用。
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;
}
@Jonny:A quick example
答案 3 :(得分:1)
以下是另一个页面上的类似解决方案: Javascript not sorting DECIMAL numbers correctly
我们的想法是首先按字符串排序然后按数字排序。
答案 4 :(得分:0)
好的,我使用了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
}