我有这个链接列表,当我的页面上生成链接时,需要对其进行排序。
链接如下所示
"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);