用数字javascript对字符串进行排序



嗨,有人能帮我用java脚本中的数字对字符串进行排序吗。

我想使用jquery根据它们的距离(9 km)对这些选项进行排序。

<select >
<option >Point a (9 km)</option>
<option >Point b (10 km)</option>
<option >Point c (2 km)</option>
</select>

基本上,我只想对包含一些数字的字符串进行排序。另一个例子。

input:
var arr = ['A (9 km)','B (10 km)','C (2 km)']
output:
C (2 km)
A (9 km)
B (10 km)

你说得对。

提前感谢

这就是你想要的吗?

const distances = ['A (9 km)','B (10 km)','C (2 km)']; 
const sorted = distances
.map((x,i)=>[parseInt(x.replace(/[^d]+/g,''),10),i])
.sort((a,b)=>a[0]-b[0])
.map(x=>distances[x[1]]);
console.log(sorted);

首先,我们需要为DOM节点分配引用。我们将父级selectContainer及其子级列表称为selectChildren

接下来,我们需要一个正则表达式模式来提取我们用来应用排序逻辑的感兴趣的值。在这种情况下,我们提取带括号的km中的数字。

最后,我们将children元素强制转换为一个数组,使其可迭代,从而允许我们使用sort方法。

在我们的排序方法中,我们使用正则表达式模式来推断我们关心的数值。

const selectContainer = document.querySelector('select');
const selectChildren = selectContainer.querySelectorAll('option');
const pattern = /.*((d+)skm).*/;
const sorted = [...selectChildren].sort((a, b) => {
const _a = parseInt(a.innerText.match(pattern)[1]);
const _b = parseInt(b.innerText.match(pattern)[1]);
return _a < _b ? -1 : 1;
});
sorted.forEach(child => selectContainer.append(child));

既然您提到了多个用例,让我们来谈谈排序部分。一旦您有了一个字符串和数字的集合,也许是元组形式的东西,比如:

var pairs = [
[9, 'A (9 km)'],
[5, 'B (5 km)'],
[5, 'C (5 km)']
];

你可以用多种方法来解决这个问题,让我们从几个简单的方法开始内置的数组函数,如排序和映射。

Sort是一个数组函数;比较器";函数,用于对数组进行排序。

这里是一个简单的例子;比较器";函数,假设您有一个元组集合,正如我上面概述的:

function compareDistanceTuples(a, b) {
// is A less than B?
if (a[0] < b[0]) {
return -1;
}
// is A grater than B?
if (a[0] > b[0]) {
return 1;
}
// A must be equal to B
return 0;
}

现在你可以使用排序和映射,以及你的新";比较器";生成您的排序列表,如下所示:

var sorted = pairs.sort(compareDistanceTuples).map(function(tuple){
return tuple[1];
});

你不能指望编写一个通用函数,它会知道如何根据字符串中的任何数字来比较任何字符串。尝试以这种方式对任何类型的字符串进行排序是因为它非常适合你的用例。在这里,我们必须相信,我们关心的数字将在括号内,后面跟着km。

排序需要为数组提供一个比较函数。sort((。给定这个特定的用例,我使用正则表达式从字符串中提取数字,然后比较数字。

//input:
var arr = ['A (9 km)', 'B (10 km)', 'C (2 km)'];
arr.sort((a, b) => {
const regEx = /((d+)s{1}km)/;

const aNumMatch = a.match(regEx);
const aNum = aNumMatch[1]

const bNumMatch = b.match(regEx);
const bNum = bNumMatch[1];

return (aNum - bNum);
});
for(let index = 0; index < arr.length; index++){
console.log(arr[index]);
}

您可以使用Array.prototype.sort对任何数组进行适当排序。

操作的核心是从字符串中提取数字,我认为您已经可以根据另一个注释来完成这一操作了。让我们假设你的函数可以完成这个pointToNumber(pointStr)

对于稍后会遇到这个问题的其他人来说,如果你知道你的字符串中只有一个数字,Number.parseInt(str.replace(/[^d]/g, ''), 10)可能会完成

也就是说,以下是如何对这样一个数组进行排序:

const arr = ['A (9 km)','B (10 km)','C (2 km)']
arr
.map(point => [pointToNumber(point), point])
.sort(([a], [b]) => {
return a - b;
})
.map(([, point]) => point);

这里真正的神奇之处在于a - b。这是因为排序比较器函数可以返回0-1(或任何负数(或1(或任何正数(。

如链接的msdn中所述,返回负数会导致a被排序为低于b的索引,而返回正数会导致a被排序为高于b的索引。

比较器中的a - b是我们想要按升序排序的一种简写方式,因为当a > b时,它会返回一个正数,使a向上移动,当a < b时,它返回一个负数,使a向下移动,当它们相同时,它将返回零。

(如果你想下降,也可以使用b - a(

最新更新