繁体   English   中英

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

[英]Sort sting with numbers javascript

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

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

    <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);

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

该操作的核心是从字符串中提取数字,我假设您已经可以根据另一条评论进行操作。 假设您的 function 可以做到这一点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 这是因为排序比较器 function 可以返回0-1 (或任何负数)或1 (或任何正数)。

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

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

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

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

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

最后,我们将子元素转换为数组,使其可迭代,从而允许我们使用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));

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

排序需要提供 function 与您的 array.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]); }

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

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

您可以通过多种方式解决该问题,让我们从一些简单的内置数组函数开始,例如sortmap

排序是一个数组 function,它采用您设计的“比较器”function 对数组进行排序。

这是“比较器”function 的一个简单示例,假设您有一个元组集合,如上所述:

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;
}

现在您可以使用sortmap以及新的“比较器”来生成排序列表,如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM