算法题 对数组进行升序排序 [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' }]
posted @ 2024-03-19 23:55  龙陌  阅读(20)  评论(0)    收藏  举报