算法题 对数组进行升序排序 [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' }]

__EOF__

本文作者龙陌
本文链接https://www.cnblogs.com/longmo666/p/18084259.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   龙陌  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示