如何对包含 JavaScript 中包含字母和数字的字符串的数组进行排序
How to sort an array that contains strings with letters and numbers in JavaScript
我正在开发一个 web 应用程序,它可以让你测试你的职业选择,它有 90 个问题,根据你的回答,它会显示一个列表,其中包含更适合的职业的前 3 个选项你。
过程:
var vars = [ calc, cFis, CBio]; //array of variables with numeric values of test results.
var keys = object.keys(vars);
var newArray = [];
var names = ['Cálculo', 'Cientifico - Físico', ect]; //array of the names of the professional abilities
//first sorting the array
keys.sort(function(a,b) {
return vars[b] - vars[a];
});
//create newArray whit the results
keys.forEach(function(key) {
newArray.push(names[key] + ' : ' + vars[key]);
});
//print results
document.getElementById('primero').innerHTML = newArray[0];
document.getElementById('segundo').innerHTML = newArray[1];
document.getElementById('tercero').innerHTML = newArray[3];
会显示:
Cálculo : 60
Cientifico - Físico : 45
ect.
问题
vars[key]
必须使用预定义值的 table 近似为百分比,如下所示:
Cálculo test points are between 60 - 65 then % must be 80%
现在要打印的字符串必须像:Cálculo : 80%
现在,假设我有 3 个职业和 3 个不同的 % 值,Cálculo : 80%
、C - Fisico : 60%
、art : 30%
我必须按它们的 % 值顺序显示,例如:
Cálculo : 80% C - Físico : 60% Art : 30%
有没有办法获取字符串中的数字字符以按数字顺序对数组进行排序?像上面的例子吗?
我正在尝试一种叫做 自然排序 的方法,但它总是在使用数字值之前使用字母值对数组进行排序。喜欢:
Art : 30% Cálculo : 80% C - Físico 60%
您可以做的一件事是将字符串转换为数字(删除末尾的 %
),然后按降序对数组进行排序:
var arr = ["Art : 30%", "Cálculo : 80%", "C - Físico: 60%"];
arr.sort(function(a, b){
// Substring between ": <substring here>%".
a = +a.substring(a.indexOf(":")+1, a.length - 1);
b = +b.substring(b.indexOf(":")+1, b.length - 1);
return b - a; // decending order
});
console.log(arr);
对于 "Art : 30%"
之类的项目,您需要在 ":"+1
的索引处开始子字符串。
另一种方法是使用正则表达式,将使用 .match(/\d+/g)
的字符串中的数字匹配到 return 仅包含数字的字符串。
var arr = ["Art : 30%", "Cálculo : 80%", "C - Físico: 60%"];
arr.sort(function(a, b) {
a = +a.match(/\d+/g);
b = +b.match(/\d+/g);
return b - a;
});
console.log(arr);
请注意使用第二种方法,如果使用的数字不是百分比,则无法使用。例如,如果一个是 "Art1 : 30%"
,则第二种方法将不起作用。解决这个问题的一种方法是使用 /\d+%/g
然后删除末尾的 %
。
我正在开发一个 web 应用程序,它可以让你测试你的职业选择,它有 90 个问题,根据你的回答,它会显示一个列表,其中包含更适合的职业的前 3 个选项你。
过程:
var vars = [ calc, cFis, CBio]; //array of variables with numeric values of test results.
var keys = object.keys(vars);
var newArray = [];
var names = ['Cálculo', 'Cientifico - Físico', ect]; //array of the names of the professional abilities
//first sorting the array
keys.sort(function(a,b) {
return vars[b] - vars[a];
});
//create newArray whit the results
keys.forEach(function(key) {
newArray.push(names[key] + ' : ' + vars[key]);
});
//print results
document.getElementById('primero').innerHTML = newArray[0];
document.getElementById('segundo').innerHTML = newArray[1];
document.getElementById('tercero').innerHTML = newArray[3];
会显示:
Cálculo : 60
Cientifico - Físico : 45
ect.
问题
vars[key]
必须使用预定义值的 table 近似为百分比,如下所示:
Cálculo test points are between 60 - 65 then % must be 80%
现在要打印的字符串必须像:Cálculo : 80%
现在,假设我有 3 个职业和 3 个不同的 % 值,Cálculo : 80%
、C - Fisico : 60%
、art : 30%
我必须按它们的 % 值顺序显示,例如:
Cálculo : 80% C - Físico : 60% Art : 30%
有没有办法获取字符串中的数字字符以按数字顺序对数组进行排序?像上面的例子吗?
我正在尝试一种叫做 自然排序 的方法,但它总是在使用数字值之前使用字母值对数组进行排序。喜欢:
Art : 30% Cálculo : 80% C - Físico 60%
您可以做的一件事是将字符串转换为数字(删除末尾的 %
),然后按降序对数组进行排序:
var arr = ["Art : 30%", "Cálculo : 80%", "C - Físico: 60%"];
arr.sort(function(a, b){
// Substring between ": <substring here>%".
a = +a.substring(a.indexOf(":")+1, a.length - 1);
b = +b.substring(b.indexOf(":")+1, b.length - 1);
return b - a; // decending order
});
console.log(arr);
对于 "Art : 30%"
之类的项目,您需要在 ":"+1
的索引处开始子字符串。
另一种方法是使用正则表达式,将使用 .match(/\d+/g)
的字符串中的数字匹配到 return 仅包含数字的字符串。
var arr = ["Art : 30%", "Cálculo : 80%", "C - Físico: 60%"];
arr.sort(function(a, b) {
a = +a.match(/\d+/g);
b = +b.match(/\d+/g);
return b - a;
});
console.log(arr);
请注意使用第二种方法,如果使用的数字不是百分比,则无法使用。例如,如果一个是 "Art1 : 30%"
,则第二种方法将不起作用。解决这个问题的一种方法是使用 /\d+%/g
然后删除末尾的 %
。