如何在JavaScript中修改后将字符串返回到原始格式
我正在尝试编写一个排序算法,用于智能地对文件大小进行排序,而不考虑输入格式。我的函数应该对字符串输入数组进行排序,以提供所需的输出,如下所示如何在JavaScript中修改后将字符串返回到原始格式,javascript,arrays,string,Javascript,Arrays,String,我正在尝试编写一个排序算法,用于智能地对文件大小进行排序,而不考虑输入格式。我的函数应该对字符串输入数组进行排序,以提供所需的输出,如下所示 input=[“5.1 GB”、“19934563 B”、“224 kB”、“0.55 GB”、“0.04 kB”、“0.02 TB”、“2.4 MB”] 输出=[“0.04 kB”、“224 kB”、“2.4 MB”、“19934563 B”、“0.55 GB”、“5.1 GB”、“0.02 TB”] 我的代码将输入更改为特定格式,以便在对值进行排序之
input=[“5.1 GB”、“19934563 B”、“224 kB”、“0.55 GB”、“0.04 kB”、“0.02 TB”、“2.4 MB”]
输出=[“0.04 kB”、“224 kB”、“2.4 MB”、“19934563 B”、“0.55 GB”、“5.1 GB”、“0.02 TB”]
我的代码将输入更改为特定格式,以便在对值进行排序之前更易于使用。它适用于格式为(“文件大小空白单位”)的输入/值。它目前给出了结果
input=[“5.1 GB”、“19934563 B”、“224 kB”、“0.55 GB”、“0.04 kB”、“0.02 TB”、“2.4\tMB”,]
输出=[“0.04 kB”、“224 kB”、“2.4 MB”、“19934563 B”、“0.55 GB”、“5.1 GB”、“0.02 TB”、]
我的问题:有没有办法在排序后恢复到字符串的原始格式,或者如何获得所需的结果?这是以原始输入格式智能排序的文件大小字符串。
我的代码在下面
function sort(fileSizes, descending) {
if (!fileSizes.length) return "Enter an List to be Sorted";
else {
let validFormat = fileSizes.map((file) => validFile(file));
if (validFormat.includes(false)) {
let formarted = fileSizes.map(item => item.replace(/\s+/g,' ').trim());
fileSizes = formarted;
};
let sortedFiles = sortSizes(fileSizes);
if (descending === true ) return sortedFiles;
if (descending === false) return sortedFiles.reverse();
}
}
//////////////////////////////////////////////
//Helper Functions
//Regular expression for valid input format
function validFile(str) {
let regEx = /^(-?\d*(\.\d+)?)\s((T|G|M|k)*B)$/;
let valid = regEx.test(str);
return valid;
}
// global comparator array
let sizes = ["B", "kB", "MB", "GB", "TB"];
//Custom Sorter
function sortSizes(arr) {
// sort by comparator
arr.sort(function(x, y) {
var x_res = x.split(" "), y_res = y.split(" ");
var x_value = x_res[0], x_unit = x_res[1];
var y_value = y_res[0], y_unit = y_res[1];
let amount = casting(x_unit, y_unit, x_value);
if(amount < y_value) {
return -1;
} else if(x_value > y_value) {
return 1;
} else {
return 0;
}
});
return arr.reverse();
}
//Convert file unit for comparison
function casting(unit_from, unit_to, amount) {
var i = sizes.indexOf(unit_from);
var j = sizes.indexOf(unit_to);
var r;
if(i < j) {
r = j - i;
} else {
r = j - i;
}
var i = 0;
if(r < 0) {
r *= (-1);
while(i < r) {
amount *= 1024;
i++;
}
} else {
while(i < r) {
amount /= 1024;
i++;
}
}
return amount;
}
console.log(sort(["5.1 GB","19934563 B","224 kB","0.55 GB","0.04 kB","0.02 TB","2.4 MB",], false)); // ["0.04 kB","224 kB","2.4 MB","19934563 B","0.55 GB","5.1 GB","0.02 TB",]
console.log(sort(["5.1 GB","19934563 B","224 kB","0.55 GB","0.04 kB","0.02 TB","2.4 MB",], true)); //["0.02 TB","5.1 GB","0.55 GB","19934563 B","2.4 MB","224 kB","0.04 kB"]
console.log(sort([], true)); //"Enter an List to be Sorted"
console.log(sort(["5.1 GB ","19934563 B"," 224 kB"," 0.55 GB ","0.04 kB ","0.02 TB","2.4\tMB",], false)); //["0.04 kB "," 224 kB","2.4\tMB","19934563 B"," 0.55 GB ","5.1 GB ","0.02 TB",]
函数排序(文件大小,降序){
如果(!fileSizes.length)返回“输入要排序的列表”;
否则{
让validFormat=fileSizes.map((文件)=>validFile(文件));
if(有效格式包括(假)){
让formarted=fileSizes.map(item=>item.replace(/\s+/g',).trim());
文件大小=格式化;
};
让sortedFiles=SortSize(文件大小);
如果(降序===true)返回SortedFile;
如果(降序===false),则返回sortedFiles.reverse();
}
}
//////////////////////////////////////////////
//辅助函数
//有效输入格式的正则表达式
函数有效文件(str){
设正则表达式=/^(-d*(\.\d+))\s((T | G | M | k)*B)$/;
设valid=regEx.test(str);
返回有效;
}
//全局比较器阵列
让大小=[“B”、“kB”、“MB”、“GB”、“TB”];
//海关分拣机
函数排序(arr){
//按比较器排序
arr.sort(函数(x,y){
变量x_res=x.split(“”),y_res=y.split(“”);
var x_value=x_res[0],x_单位=x_res[1];
变量y_值=y_res[0],y_单位=y_res[1];
让量=铸件(x_单位,y_单位,x_值);
如果(金额y_值){
返回1;
}否则{
返回0;
}
});
返回arr.reverse();
}
//转换文件单元以进行比较
功能转换(单位从、单位到、金额){
var i=尺寸指数(单位为);
var j=尺寸指数(单位至);
var-r;
if(i
const input=[“5.1 GB”、“19934563 B”、“224 kB”、“0.55 GB”、“0.04 kB”、“0.02 TB”、“2.4\tMB”]
常数乘数={
B:10**0,
kB:10**3,
MB:10**6,
国标:10**9,
结核病:10**12,
}
输入.排序((a,b)=>{
常量正则表达式=/\s+/;
常量[valueA,unitA]=a.trim().split(正则表达式)
常量[valueB,unitB]=b.trim().split(正则表达式)
常数A=数字(值A)*乘数[unitA]
常数B=数字(值B)*乘数[unitB]
返回A-B;
})
log(输入)
我的意思是,在任何字符串修改之前,我只会采用before=[]
和before=[]
的方法。或者在执行主进程时简单地附加一个要引用的单独对象。仅在.sort()
回调中临时转换值,或者使用对象({original:…,modified:…}
),使用.modified
值排序,然后提取.original
值,或者…->“到目前为止,你是如何独自解决这个问题的?”安德烈亚斯我的想法没错,很好的参考。