记录两道JavaScript笔试题

66 阅读1分钟

解析URL地址

写一个JavaScript函数进行url地址解析参数

//"https://example.com/?query=1&id=11773" --> {query: 1, id: 11773}
//"https://example.com/check?search?query=1&id=11773" --> {}
//"https://cn.bing.com/search?q=%E5%89%8D%E7%AB%AF"  --> {q: "前端"}

第一种简单粗暴的分割字符串去解析参数

function parseURLParams(url) {
  const params = {}
  const urlParts = url.split('?')
  if (urlParts.length <= 2) {
    const queryString = url.split('?')[1]

    if (!queryString) {
      return params
    }

    const pairs = queryString.split('&')

    pairs.forEach((pair) => {
      const [key, value] = pair.split('=')
      params[key] = decodeURIComponent(value)
    })

    return params
  }
  return params
}

第二种使用Web API接口参考提供的URL()构造函数去返回一个新创建的 URL 对象去解析

function parseURLParams(url) {
  const params = {};
  const urlParts = url.split("?");
  if (urlParts.length <= 2) {
    const urlObj = new URL(url);
    urlObj.searchParams.forEach((value, key) => {
      params[key] = value;
    });
  }
  return params;
}

计算选择题分数

写一个JavaScript函数计算选择题分数,单选,多选,多选题少选,漏选得一半分,多选不得分

const correct = [['c'], ['a', 'b'], ['a', 'c'], ['b', 'e'], ['c', 'd']]

const answer = [['d'], [], ['a', 'b', 'c'], ['b'], ['c', 'd']]

主要还是看考虑的情况多

function calculateScore(correct, answer) {
  let totalScore = 0

  for (let i = 0; i < correct.length; i++) {
    const correctAnswers = correct[i]
    const studentAnswers = answer[i]

    if (studentAnswers.length === 0) {
      // 未答题,不得分
      continue
    } else if (correctAnswers.length === 1) {
      // 单选题
      if (
        studentAnswers.length === 1 &&
        studentAnswers[0] === correctAnswers[0]
      ) {
        // 回答正确得分
        totalScore++
      }
    } else {
      // 多选题
      let correctCount = 0
      let incorrectCount = 0

      for (let j = 0; j < studentAnswers.length; j++) {
        if (correctAnswers.includes(studentAnswers[j])) {
          correctCount++
        } else {
          incorrectCount++
        }
      }

      if (incorrectCount === 0 && correctCount === correctAnswers.length) {
        // 全选对得满分
        totalScore++
      } else if (correctCount > 0) {
        // 部分选对得一半分
        totalScore += 0.5
      }
    }
  }

  return totalScore
}

写法比较生硬,有其他思路的大佬可以评论交流~~