牛客JS题(十七)总成绩排名

注释很详细,直接上代码

涉及知识点:

  1. 引用传值
  2. 深拷贝
  3. 合理封装

题干:
在这里插入图片描述

我的答案

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
  </head>
  <body>
    <script type="text/javascript">
        /**
         * 这题虽然没啥难度但值得斟酌的地方可不少,咱刷题可不能只看结果
         * 
         * 1. 我们已知JS将数组当作参数传递传的是引用,
         *    也就是说我们在函数里面的修改是会修改外部的,那还需要返回值吗,不需要对吧
         *    这里既然需要返回值说明我们不应该修改原数组,也就是说使用深拷贝,
         *    我们的深拷贝采用朴素的方法,使用JSON.parse(JSON.stringify(obj))嵌套
         *    深拷贝会经常使用,所以封装个函数也是情有可原,对吧
         * 
         * 2. sort函数的条件咱之前说过很多次,这次就省略了,
         *    但是计算总分的函数是不是值得封装一下,
         *    如果只是一个一个列举的话,很难复用对吧,所以我们可以传入需要参与计算的属性
         *    当然为了这题方便,我们完全可以给这个参数设个默认值,
         *    考虑到属性值可能字符串存的数字,顺便也转化一下
         */
      const _rank = (array) => {
        const newArray = deepCopy(array);

        // 补全代码
        newArray.sort((firstItem, secondItem) => {
          return getTotalPoints(secondItem) - getTotalPoints(firstItem);
        });
        return newArray;
      };

      /**
       * 获取学生总分
       * @param {object} item - 学生对象
       * @param {string[]} [subjects=["chinese","math","english"]]  - 课程列表
       * @returns {number} - 学生总分
       */
      const getTotalPoints = (
        item,
        subjects = ["chinese", "math", "english"]
      ) => {
        let totalPoints = 0;
        subjects.forEach((subject) => {
          totalPoints += Number(item[subject]);
        });
        return totalPoints;
      };

      /**
       * 深拷贝
       * @param {object} obj - 需要拷贝的对象
       * @returns {object} - 拷贝后的对象
       */
      const deepCopy = (obj) => {
        return JSON.parse(JSON.stringify(obj));
      };

      let students = [
        { id: "1", chinese: 90, math: 90, english: 100 },
        { id: "2", chinese: 90, math: 100, english: 80 },
        { id: "3", chinese: 100, math: 100, english: 90 },
      ];

      console.log(_rank(students));
      console.log(students); //原始数据不变
    </script>
  </body>
</html>

博客更新不是很及时,需要看后面内容的可以看看我的gitee仓库

牛客JS题Gitee仓库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码对我眨眼睛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值