【发布时间】:2021-08-02 13:25:00
【问题描述】:
我正在尝试智能地对文件大小字符串的列表/数组进行排序(升序或降序)。字符串格式数字(带或不带小数)后跟空格,然后是单位。
例如 - ["5.1 GB", "19934563 B","224 kB","0.55 GB","0.04 kB","0.02 TB","2.4 MB",] 结果为 ["0.02 TB "、"5.1 GB"、"0.55 GB"、"19934563 B"、"2.4 MB"、"224 kB"、"0.04 kB"]
这是我目前所拥有的:
if (!fileSizes.length) return "Enter an List to be Sorted";
else {
//Check input formart of strings
let validFormat = fileSizes.map((file) => validFile(file));
if (validFormat.includes(false)) return "Invalid Input format";
else {
let myfiles = reOrderFormat(fileSizes);
if (descending === true) {
sorter = MySort("TGMkB");
let mysortedFiles = myfiles.sort(sorter);
//sort by number for repeated file sizes
let result = reOrderFormat(mysortedFiles);
return result;
} else {
sorter = MySort("BkMGT");
let mysortedFiles = myfiles.sort(sorter);
//sort by number for repeated file sizes
let result = reOrderFormat(mysortedFiles);
return result;
}
}
}
}
//Helper Functions for checking input format
//Regular expression for correct input format
function validFile(str) {
let regEx = /^(-?\d*(\.\d+)?)\s((T|G|M|k)*B)$/;
let valid = regEx.test(str);
return valid;
}
//Checks if input is in right format
function validList(arr) {
let validArray = arr.map((fileSiz) => validFile(fileSiz));
return arr;
}
//Helper functions for sorting and reoredering input format
//Format reordering function
function reOrderFormat(arr) {
let reOrdered = [];
arr.map((file) => {
let out = file.split(" ");
let first = out[1];
let second = out[0];
let newOrder = first + " " + second;
reOrdered.push(newOrder);
});
return reOrdered;
}
//Custom sorter
function MySort(alphabet) {
return function (a, b) {
var index_a = alphabet.indexOf(a[0]),
index_b = alphabet.indexOf(b[0]);
if (index_a === index_b) {
// same first character, sort regular
if (a < b) {
return -1;
} else if (a > b) {
return 1;
}
return 0;
} else {
return index_a - index_b;
}
};
}
sort(
["5.1 GB", "19934563 B", "224 kB", "0.55 GB", "0.04 kB", "0.02 TB", "2.4 MB"],
true
);
它不会对重复的单元进行相应的排序,还会混淆以字节为单位的长数字。
我需要帮助编写更高效的代码。
【问题讨论】:
-
有没有办法以字节为单位获取输入文件的大小?对数组进行排序要容易得多。
-
或者简单地实现
MySort中的逻辑,将元素转换为以字节为单位的文件大小并比较这些值。
标签: javascript arrays string sorting