js牛客网编程练习汇总(二)

一、请补全JavaScript代码,要求根据下拉框选中的条件变换重新渲染列表中展示的商品,且只展示符合条件的商品。

            注意:1. 必须使用DOM0级标准事件(onchange)

                       2. 建议使用ES6的filter方法

<!DOCTYPE html>
<html lang="en">

<head>
      <meta charset="UTF-8">
</head>

<body>
      <select name="" id="">
            <option value="0">请选择销量范围</option>
            <option value="1">&lt100</option>
            <option value="2">100~500</option>
            <option value="3">&gt500</option>
      </select>
      <ul>
            <li>牛客logo马克杯</li>
            <li>无盖星空杯</li>
            <li>老式茶杯</li>
            <li>欧式印花杯</li>
      </ul>

      <script>
            var cups = [{
                        type: 1,
                        price: 100,
                        color: 'black',
                        sales: 60,
                        name: '牛客logo马克杯'
                  },
                  {
                        type: 2,
                        price: 40,
                        color: 'blue',
                        sales: 100,
                        name: '无盖星空杯'
                  },
                  {
                        type: 4,
                        price: 60,
                        color: 'green',
                        sales: 200,
                        name: '老式茶杯'
                  },
                  {
                        type: 3,
                        price: 50,
                        color: 'green',
                        sales: 600,
                        name: '欧式印花杯'
                  }
            ]
            var select = document.querySelector('select');
            var ul = document.querySelector('ul');
            // 补全代码
            /**
             * 请补全JavaScript代码,要求根据下拉框选中的条件变换重新渲染列表中展示的商品,且只展示符合条件的商品。
            注意:
            1. 必须使用DOM0级标准事件(onchange)
            2. 建议使用ES6的filter方法
            */
            select.onchange = function (e) {
                  ul.innerHTML = ''
                  switch (parseInt(this.value)) {
                        case 1:
                              var newArr = cups.filter((item) => {
                                    return item.sales < 100
                              })
                              break
                        case 2:
                              var newArr = cups.filter((item) => {
                                    return item.sales >= 100 && item.sales <= 500
                              })
                              break
                        case 3:
                              var newArr = cups.filter((item) => {
                                    return item.sales > 500
                              })
                              break
                  }
                  showContent(newArr)
            }

            function showContent(arr) {
                  var str = ''
                  arr.forEach(item => {
                        str += `<li>${item.name}</li>`
                  });
                  ul.innerHTML = str
            }
      </script>
</body>

</html>

二、请补全JavaScript代码,要求在Number对象的原型对象上添加"_isPrime"函数,该函数判断调用的对象是否为一个质数,是则返回true,否则返回false。

      <script type="text/javascript">
            // 补全代码
            /**
             * 请补全JavaScript代码,要求在Number对象的原型对象上添加"_isPrime"函数,
             * 该函数判断调用的对象是否为一个质数,是则返回true,否则返回false。
             */
            // 质数:指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
            Number.prototype._isPrime = function (num) {
                  if (num < 2) return false
                  for (var i = 2; i < num; i++) {
                        if (num % i === 0) {
                              return false
                        }
                  }
                  return true
            }
      </script>

三、请补全JavaScript代码,要求以Boolean的形式返回字符串参数是否符合身份证标准。

注意:1. 无需考虑地区信息、出生日期、顺序码与校验码的验证

      <script>
            /**
             * 请补全JavaScript代码,要求以Boolean的形式返回字符串参数是否符合身份证标准。
            注意:
            1. 无需考虑地区信息、出生日期、顺序码与校验码的验证
            */
            // 41088219980825152X
            /**
             * 分析身份证分为一代和二代
             * (1)一代15位,可以是15位数字(^\d{15}$):\d 数字字符等同于0-9,{15}代表15位
             * (2)二代18位,可以是15位数字(^\d{18}$):\d 数字字符等同于0-9,{18}代表15位
             * (3)身份证最后一位可能是''x'|'X'',(^\d{17}(\d|X|x)$
             */
            const _isCard = number => {
                  var regx = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
                  return regx.test(number)
            }
      </script>

四、请补全JavaScript代码,要求以键/值对的对象形式返回参数数组。要求如下:

         1. 键名的数据类型为Symbol

         2. 键值为当前数组项

         3. Symbol的描述为当前数组项

         4. 返回普通对象

            const _symbolKey = array => {
                  // 补全代码
                  let obj = new Object()
                  array.forEach(aa => {
                        obj[Symbol(aa)] = aa
                  });
                  return obj
            }

五、请补全JavaScript代码,要求以boolean的形式返回两个Set对象参数是否一样,是则返回true,否则返回false。

      <script>
            /**
             * 请补全JavaScript代码,
             * 要求以boolean的形式返回两个Set对象参数是否一样,是则返回true,否则返回false
             */
            const _isSameSet = (s1, s2) => {
                  // 补全代码
                  if (s1.size !== s2.size) {
                        return false
                  }
                  return [...s1].every(i => s2.has(i))
            }
            const letters = new Set();
            const letters1 = new Set();
            letters.add('a');
            letters.add('b');
            letters.add('c');
            letters1.add(0)
            letters1.add('d')
            letters1.add('f')
            console.log(_isSameSet(letters, letters1))
      </script>

 知识点补充:

new Set() 创建新的 Set 对象。
add() 向 Set 添加新元素。
clear() 从 Set 中删除所有元素。
delete() 删除由其值指定的元素。
entries() 返回 Set 对象中值的数组。
has() 如果值存在则返回 true。
forEach() 为每个元素调用回调。
keys() 返回 Set 对象中值的数组。
values() 与 keys() 相同。
size 返回元素计数。

 六、请补全JavaScript代码,完成名为"Rectangle"的矩形类。要求如下:
        1. 构造函数只包含两个参数,依次为"height"、"width"
        2. 设置Getter,当获取该对象的"area"属性时,返回该对象"height"与"width"属性的乘积

这里涉及到了class类的知识点,可以参考以下详细讲解文章:

ES6--class类(详解/看完必会)_class类详解_suoh's Blog的博客-CSDN博客

<script type="text/javascript">
      /**
       * 请补全JavaScript代码,完成名为"Rectangle"的矩形类。要求如下:
      1. 构造函数只包含两个参数,依次为"height"、"width"
      2. 设置Getter,当获取该对象的"area"属性时,返回该对象"height"与"width"属性的乘积
      */
      class Rectangle {
            // 补全代码
            constructor(height, width) {
                  this.height = height
                  this.width = width
            }
            get area() {
                  return this.calcArea()
            }
            calcArea() {
                  return this.height * this.width
            }
      }
      var area = new Rectangle(12, 12).area
      console.log(area)
</script>

七、请补全代码,要求当滑动id为"range"的滑块控件时可以改变id为"rect"的矩形旋转速度。要求如下:
        1. id为"rect"的矩形初始动画周期为10秒
        2. id为"range"的滑块控件默认值为1、最小值为、最大值为10、滑动间隔为1
        3. 当滑动滑块值为1时,矩形动画周期为10秒、当...,为...、当滑动滑块值为10时,矩形动画周期为1秒
注意:
1. 必须使用DOM0级标准事件(onchange)

<!DOCTYPE html>
<html>

<head>
      <meta charset=utf-8>
      <style type="text/css">
            #rect {
                  width: 120px;
                  height: 100px;
                  background-color: black;
                  /*补全代码*/
                  animation: rect 10s linear infinite;
            }

            @keyframes rect {
                  from {
                        transform: rotate(0deg);
                  }

                  to {
                        transform: rotate(360deg);
                  }
            }
      </style>
</head>

<body>
      <!-- 补全代码 -->
      <div id="rect"></div>
      <input id="range" type="range" step="1" defaultValue="1" value="5" min="1" max="10" />

      <script type="text/javascript">
            // 补全代码
            document.querySelector('#range').onchange = function () {
                  let speed = document.querySelector('#range').value
                  document.querySelector('#rect').style.animationDuration = 11 - speed + 's'
            }
      </script>
</body>

</html>

知识点: 

input框的type类型为range,就是一个进度条展示,可能平时用的少,今天拓展一下

<input id="range" type="range" step="1" defaultValue="1" value="5" min="1" max="10" />

 动画属性:

animation: name duration timing-function delay iteration-count direction;
animation-name 规定需要绑定到选择器的 keyframe 名称。
animation-duration 规定完成动画所花费的时间,以秒或毫秒计。
animation-timing-function

规定动画的速度曲线。

animation-delay 规定在动画开始之前的延迟。
animation-iteration-count 规定动画应该播放的次数。
animation-direction 规定是否应该轮流反向播放动画。
animation-fill-mode 规定动画在执行时间之外应用的值。
animation-play-state 规定动画是正在运行还是暂停。

 八、根据题目要求,将页面中的“p”标签DOM节点保存在Map对象的键名中,其内容保存在键值中,核心步骤有:

  1. 通过document.querySelector获取页面中“p”元素标签
  2. 初始化Map实例保存“p”标签DOM节点和内容
<body>
      <p>1</p>
      <script type="text/javascript">
            /**
             * 请补全JavaScript代码,要求将页面中的"p"标签以键名的形式保存在Map对象中,
             * 键名所对应的键值为该"p"标签的文字内容。
             */
            const _elementKey = () => {
                  // 补全代码
                  let p = document.querySelector('p')
                  return new Map([
                        [p, p.innerText]
                  ])
            }
            console.log(_elementKey())
      </script>
</body>

九、请补全JavaScript代码,实现以下效果:
        1. 选中"全选"框,以下所有选项全部勾选。
        2. 把"全选"框从选中状态勾选成未选中状态,其他复选框全部取消选中效果。
        3. 当其他复选框全部选中,"全选框"为选中状态。
        4. 当其他复选框有一个未选中,"全选框"取消选中状态。
注意:
        1. 必须使用DOM0级标准事件(onchange)

<!DOCTYPE html>
<html lang="en">

<head>
      <meta charset="UTF-8">
</head>
<style>
      ul {
            list-style: none;
      }
</style>

<body>
      <ul>
            <li>全选<input type='checkbox' id='all'></li>
            <li>Java<input type='checkbox' class='item'></li>
            <li>javaScript<input type='checkbox' class='item'></li>
            <li>C++<input type='checkbox' class='item'></li>
            <li>python<input type='checkbox' class='item'></li>
            <li>.net<input type='checkbox' class='item'></li>
      </ul>

      <script>
            // 补全代码
            var all = document.querySelector('#all')
            // 将类数组使用from转化为真正的数组才能使用every
            var options = Array.from(document.querySelectorAll('.item'))
            // 全选
            all.onchange = () => {
                  options.forEach(x => x.checked = all.checked)
            }
            // 利用every判断当最后一个子级勾选后则为全选
            options.forEach((item) => {
                  item.onchange = function () {
                        all.checked = options.every(x => x.checked)
                  }
            })
      </script>
</body>

</html>

知识点:

Array.from()方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组,也是ES6的新增方法。

那么什么是类数组对象呢?所谓类数组对象,最基本的要求就是具有length属性的对象

所以document.querySelectorAll('.item')在没转换为真正的数组时是下面这样的。

 转换后:

十、请补全JavaScript代码,要求以boolean的形式返回参数字符串是否为回文字符串。

<script type="text/javascript">
      // 请补全JavaScript代码,要求以boolean的形式返回参数字符串是否为回文字符串。
      // 法一:
      const _isPalindrome = string => {
            // 补全代码
            var arr = string.split('')
            // 反转数组
            var newArr = JSON.parse(JSON.stringify(arr)).reverse()
            // 比较两个数组,有一个不相等即为false
            var flag = arr.every((item, i) => {
                  return item == newArr[i]
            })
            return flag
      }
      // 法二:
      const _isPalindrome2 = string => {
            return string === string.split('').reverse().join('')
      }
</script>

学会巧妙运用数组的reverse反转方法,以及数组转字符串方法join。

猜你喜欢

转载自blog.csdn.net/qq_41579104/article/details/129747365
今日推荐