返回列表 发帖

[原创代码] order.js 按指定顺序排序

本帖最后由 CrLf 于 2014-9-27 07:54 编辑

常见的排序方式无法自定义排序的依据,像 2>1>3 这样非线性的排序规则就无法实现了,比如这个帖子,有点想法,就写了这个脚本
将下列代码保存为 order.bat 双击可以看演示结果,若保存为 order.js 则可以作为第三方来调用
@set @bathome=1/*&echo off
(
for %%a in (
"中国 12345" "韩国 654321" "新加坡 wwwww" "1234657"
"abcnnhjhka" "美国 abcd" "日本 00000"
) do echo %%~a
)>text.txt
::生成测试样本
cscript -nologo -e:jscript %0 中国 美国 日本 韩国 新加坡 <text.txt
::批处理调用示例
pause & eixt /b */
var list=[],
pattern='.|^$',
obj={}
var unname = WScript.Arguments.UnNamed
for(var i=unname.length;i--;){
obj[unname(i)]=i+1
pattern = (unname(i).replace(/,/,'\\$&')) + '|' + pattern
}
var re = (new RegExp()).compile(pattern,'g')
//将命令行参数处理为正则表达式,编译为 re 变量
//并将命令行参数作为对象的属性存储到 obj 对象中
var text = WScript.StdIn.ReadAll().split(/[\r\n]+/g)
//将每行文本保存在数组中
for(var i in text){
var array=[]
var match=text[i].match(re)
for(var j=0;j<match.length;j++){
array.push((obj[match[j]]!==undefined)?-obj[match[j]]:match[j])
}
text[i] = array
}
//对每行进行正则匹配,将命令行参数对应的内容映射为负值,未匹配的内容逐字切分
text = text.sort()
//根据数组中的数组进行排序
for(var i in text){
var array=[]
for(var j in text[i]){
array.push((-text[i][j]>0)?unname(-1-text[i][j]):text[i][j])
}
WScript.Echo(array.join(''))
}
//对负值部分映射为对应的命令行参数内容
//连接数组并输出COPY

返回列表