如何在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
值,或者…->“到目前为止,你是如何独自解决这个问题的?”安德烈亚斯我的想法没错,很好的参考。