如何从字符串的特定部分以数字方式对列表进行排序



我有这个链接列表,当我的页面上生成链接时,需要对其进行排序。

链接如下所示

"https://www.dropbox.com/s/###/NF%208975%###" "https://www.dropbox.com/s/###/NF%207600%###"

然后,当它们生成到我的页面上时,我会将它们映射出来,并根据链接末尾的内容创建一个名称(删除所有垃圾字符)。

是否可以在不更改 url 的情况下,根据 url 末尾的内容对它们进行数字排序。这样,当我映射它们时,它们已经订购了。

喜欢这个:

NF%207600%###

NF%208975%###

我已经浏览了一些类似的SO问题,但似乎找不到任何相对的东西。

您可以使用正则表达式提取数字,然后通过它进行比较:

var urls = ["https://www.dropbox.com/s/###/NF%208975%###", "https://www.dropbox.com/s/###/NF%207600%###"]
function extract_number(url) {
return Number(url.replace(/.*%(d+)%.*/, "$1"))
}
urls.sort(function(a, b) {
if(extract_number(a) < extract_number(b)) {
return -1;
} 
if(extract_number(a) > extract_number(b)) {
return 1;
} 
return 0;
})
console.log(urls);

你可以.map().sort().map().它可能看起来很笨重,但如果你有很多 URL,这更高性能,因为您不必每次将一个 URL 与另一个 URL 进行比较时都执行数字解析正则表达式替换。例如,比较仅对 5 个 URL 进行排序时的调用量:

var array = [
'https://www.dropbox.com/s/###/NF%208975%###',
'https://www.dropbox.com/s/###/NF%209213%###',
'https://www.dropbox.com/s/###/NF%205346%###',
'https://www.dropbox.com/s/###/NF%201764%###',
'https://www.dropbox.com/s/###/NF%207600%###'
];
function getId(url) {
return Number(url.replace(/^.*%(d+)%.*$/, '$1'));
}
function count(func) {
function wrapper() {
wrapper.count++;
return func.apply(this, arguments);
}

wrapper.count = 0;

return wrapper;
}
var countGetId = count(getId);
var sorted = array
.map(url => ({ url, number: countGetId(url) }))
.sort((a, b) => a.number - b.number)
.map(obj => obj.url);
console.log('.map().sort().map()')
console.log(sorted);
console.log('getId called ' + countGetId.count + ' times');
var countGetId = count(getId);
var sorted = array.sort((a, b) => countGetId(a) - countGetId(b))
console.log('.sort()')
console.log(sorted);
console.log('getId called ' + countGetId.count + ' times');

所以,只需这样做:

function getId(url) {
return Number(url.replace(/^.*%(d+)%.*$/, '$1'));
}
var sorted = array
.map(url => ({ url, number: getId(url) }))
.sort((a, b) => a.number - b.number)
.map(obj => obj.url);
console.log(sorted);

相关内容

最新更新