算法题 对数组进行升序排序 [2.12, 9.10, '3.05-5.8']
算法题
function parseItem(item) {
const isNumber = typeof item === 'number';
const strItem = isNumber ? String(item) : item;
const dashIndex = strItem.indexOf('-');
if (dashIndex === -1) {
// 若不含横线,认为是点
return isNumber ? item : Number(strItem.trim());
} else {
// 若包含横线,认为是区间
const [startStr, endStr] = strItem.split('-').map(parseFloat);
return { start: Number(startStr.toFixed(2)), end: Number(endStr.toFixed(2)) };
}
}
function compareItems(aParsed, bParsed) {
if (typeof aParsed === 'object') {
return typeof bParsed === 'object'
? aParsed.start - bParsed.start
: aParsed.start - bParsed;
} else {
return aParsed - (typeof bParsed === 'object' ? bParsed.start : bParsed);
}
}
const inputList = [2.12, '9.10', '3.05-5.8', '7.6'];
const parsedList = inputList.map(parseItem);
const sortedList = parsedList.slice().sort(compareItems);
console.log(sortedList.map(item => (typeof item === 'object' ? `${item.start.toFixed(2)}-${item.end.toFixed(2)}` : item.toFixed(2)))); // 输出:['2.12', '3.05-5.8', '7.6', '9.10']
首先通过 parseItem 函数将数组中的每个元素解析为数值或区间对象,然后在 compareItems 函数中根据对象类型进行比较。
这样,我们不再需要显式地判断输入元素是否为字符串,而是依据是否解析出区间对象来进行区分。
附加题
若数组中是许多对象,其中对象中有一个mz属性,值为例如上述的2.12, '9.10', '3.05-5.8', '7.6'等,如何才能将这些对象,按照mz属性进行从小到大升序排列??
// 定义一个函数,用于解析对象的mz属性,并将其转换为可比较的数值或区间对象
function parseMz(mzValue) {
const isNumber = typeof mzValue === 'number';
const strMz = isNumber ? String(mzValue) : mzValue;
// 检查mz属性值是否包含横线(区间)
const dashIndex = strMz.indexOf('-');
if (dashIndex === -1) {
// 若不含横线,认为是点,转换为浮点数并保留两位小数
return isNumber ? mzValue : Number(strMz.trim()).toFixed(2);
} else {
// 若包含横线,认为是区间,分割并转换为浮点数,保留两位小数
const [startStr, endStr] = strMz.split('-').map(parseFloat);
return { start: startStr.toFixed(2), end: endStr.toFixed(2) };
}
}
// 定义一个函数,用于比较两个经过parseMz解析后的数值或区间对象
function compareMz(aParsed, bParsed) {
if (typeof aParsed === 'object') {
// 如果两者都是区间对象,按照起始值进行比较
return typeof bParsed === 'object'
? aParsed.start - bParsed.start
: aParsed.start - bParsed;
} else {
// 如果a是点或区间起始值,b是点或区间起始值,则按照数值大小进行比较
return aParsed - (typeof bParsed === 'object' ? bParsed.start : bParsed);
}
}
// 定义一个函数,用于直接比较两个对象的mz属性值
function parseAndCompareMz(a, b) {
return compareMz(parseMz(a.mz), parseMz(b.mz));
}
// 示例数据:一个包含对象的数组,每个对象有一个mz属性
const inputList = [
{ mz: 2.12 },
{ mz: '9.10' },
{ mz: '3.05-5.8' },
{ mz: '7.6' }
];
// 先复制原数组,然后按照mz属性值进行排序
const sortedList = inputList.slice().sort(parseAndCompareMz);
// 格式化排序后的mz属性值,并输出排序后的对象数组
console.log(sortedList.map(item => ({
...item,
// 根据mz属性值的类型,保留两位小数或格式化为区间字符串
mz: typeof item.mz === 'object' ? `${item.mz.start}-${item.mz.end}` : item.mz
}))); // 输出:[{ mz: '2.12' }, { mz: '3.05-5.8' }, { mz: '7.6' }, { mz: '9.10' }]

浙公网安备 33010602011771号