【JavaScript】五个常用功能/案例:判断特定结尾字符串 | 获取指定字符串 | 颜色字符串转换 | 字符串转驼峰格式 | 简易购物车

news2024/11/19 6:41:11

CSDN话题挑战赛第2期
参赛话题:学习笔记

🖥️ NodeJS专栏:Node.js从入门到精通
🖥️ 博主的前端之路:前端之行,任重道远(来自大三学长的万字自述)
🖥️ TypeScript知识总结:TypeScript从入门到精通(十万字超详细知识点总结)
🧑‍💼个人简介:大三学生,一个不甘平庸的平凡人🍬
👉 你的一键三连是我更新的最大动力❤️!
🏆分享博主自用牛客网🏆:一个非常全面的面试刷题求职网站,点击跳转🍬


文章目录

  • 前言
  • 一、判断特定结尾的字符串
  • 二、获取指定字符串
  • 三、颜色字符串格式转换
  • 四、将字符串转换为驼峰格式
  • 五、实现简易购物车
  • 结语

前言

最近博主一直在牛客网刷题巩固基础知识,牛客网不仅具有公司真题专项练习面试题库在线编程等功能,还具有非常强大的AI模拟面试功能,简直是求职者的福音!

牛客网里的题库非常全面的,无论你是前端还是后端,是想要备考还是准备面试又或者是想要提高自己,你都能在牛客网上找到适合自己的题,赶快点击链接去注册登录吧:点我进入牛客网

牛客网牛客网
在这里插入图片描述在这里插入图片描述

本篇文章所有示例来自于牛客网题库/在线编程/JS篇,这些都是前端开发中常用的功能,借此记录一下刷题过程,巩固基础!

一、判断特定结尾的字符串

描述:

给定字符串 str,检查其是否以元音字母结尾
1、元音字母包括 aeiou,以及对应的大写
2、包含返回 true,否则返回 false

示例:

输入:'gorilla'
输出:true

方案一: 运用数组进行判断

function endsWithVowel(str) {
    const arr=['a','e','i','o','u']
    return arr.includes(str[str.length-1].toLowerCase())
}

知识点:

  • includes()方法用来判断一个数组是否包含一个指定的值。
  • toLowerCase() 会将调用该方法的字符串值转换为小写形式,并返回。

方案二: 使用正则

function endsWithVowel(str) {
    const reg=/[aeiou]$/gi
    return reg.test(str)
}

知识点:

  • [aeiou]表示匹配一个字符,它可以是“a”、“e”、“i”、“o”、“u”之一。
  • 正则表达式后面的gi是正则的一个修饰符,g表示全局匹配,i表示不区分大小写。
  • $(美元符号)匹配结尾,在多行匹配中匹配行结尾。
  • test() 方法执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回 truefalse

二、获取指定字符串

描述:

给定字符串 str,检查其是否包含 连续3个数字,请使用正则表达式实现。
1、如果包含,返回最先出现的 3 个数字的字符串
2、如果不包含,返回 false

示例:

输入:'9876543'

输出:'987'

方案:

function captureThreeNumbers(str) {
  const reg=/\d{3}/g
  if(reg.test(str)){
      return str.match(reg)[0]
  }
    return false
}

知识点:

  • \d就是[0-9],表示是一位数字。
  • {m} 等价于{m,m},表示出现mm次,即m次。({m,n},表示出现mn次。)
  • 正则表达式后面的g是正则的一个修饰符,表示全局匹配。
  • test() 方法执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回 truefalse
  • match()方法检索返回一个字符串匹配正则表达式的结果。(数组形式

三、颜色字符串格式转换

描述:

rgb 颜色字符串转换为十六进制的形式,如 rgb(255, 255, 255) 转为 #ffffff

  1. rgb 中每个 , 后面的空格数量不固定
  2. 十六进制表达式使用六位小写字母
  3. 如果输入不符合 rgb 格式,返回原始输入

示例:

输入:'rgb(255, 255, 255)'

输出:#ffffff

方案一:

function rgb2hex(sRGB) {
    const reg = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/;
    const ret = sRGB.match(reg);
    
    if (!ret) {
        return sRGB;
    } else {
        var str = "#";
        for (var i = 1; i <= 3; i++) {
            var m = parseInt(ret[i]);
            if (m >= 0 && m <= 255) {
                str += m < 16 ? "0" + m.toString(16) : m.toString(16);
            } else {
                return sRGB;
            }
        }
        return str;
    }
}

知识点:

  • 正则里

    • ^表示开头;
    • \代表转义(如不能直接输入(,需要输入\((进行转义);
    • \d就是[0-9],表示是一位数字;
    • + 等价于{1,},表示出现至少一次;
    • \s[ \t\v\n\r\f],表示空白符,包括空格、水平制表符、垂直制表符、换行符、回车符、换页符;
    • * 等价于{0,},表示出现任意次,有可能不出现。
    • $代表结尾
  • parseInt(string,radix) 解析一个字符串并返回指定基数(radix)的十进制整数,radix是2-36之间的整数,假如radix指定 0 或未指定,基数将会根据字符串的值进行推算。

  • rgb(a, b, c) 中的abc都在0~255之间。

  • match() 方法检索返回一个字符串匹配正则表达式的结果(数组形式),如果正则表达式没有设置全局标志 (g),数组的0元素包含整个匹配,而第 1 到 n 元素包含了匹配中曾出现过的任一个子匹配。这相当于没有设置全局标志的 exec 方法。如果设置了全局标志(g),元素0到n中包含所有匹配。

    var regexp = /rgb\((\d+),\s*(\d+),\s*(\d+)\)/g; // 加g全局匹配
    var ret = "rgb(255,  250, 255)".match(regexp);
    console.log("全局匹配结果:", ret); // 全局匹配结果: [ 'rgb(255,  250, 255)' ]
    
    var regexp = /rgb\((\d+),\s*(\d+),\s*(\d+)\)/; // 不加g
    var ret = "rgb(255,  250, 255)".match(regexp);
    console.log("匹配结果:", ret);
    // 匹配结果: [
    //     'rgb(255,  250, 255)',
    //     '255',
    //     '250',
    //     '255',
    //     index: 0,
    //     input: 'rgb(255,  250, 255)',
    //     groups: undefined
    //   ]
    

思路:

先使用正则判断输入的内容是否符合rgb格式,是的话就for循环遍历到rgb中的三个数值字符串,通过parseInt将其转换成数值,再进一步判断其是否在0~255之间,是的话就继续操作,通过toString(16)转换成16进制字符串(需要注意的是,如果原数小于16,转换成16进制后就只有一位,这时就需要在它前面补0,因为案例要求的是十六进制表达式使用六位小写字母,每两位表示一个rgb中的一个数值)

方案二: 优雅永不过时!

function rgb2hex(sRGB) {
    try {
        return eval(sRGB);
    } catch (err) {
        // 出现错误了就直接返回sRGB
        return sRGB;
    }
}
// 定义一个rgb方法(因为sRGB字符串是rgb(a,b,c)格式的,当作JS代码执行时相当于是调用rgb函数)
function rgb(r, g, b) {
    // 有一个数值不在0~255范围内就抛出错误
    if (!num(r) || !num(g) || !num(b)) {
        throw Error;
    }

    let rH = r.toString(16);
    let gH = g.toString(16);
    let bH = b.toString(16);
    // 是一位时在前面补零补成两位
    rH = rH.length == 1 ? "0" + rH : rH;
    gH = gH.length == 1 ? "0" + gH : gH;
    bH = bH.length == 1 ? "0" + bH : bH;
    return "#" + rH + gH + bH;
}

// 判断数值范围是否在0~255之间
function num(num) {
    return parseInt(num) >= 0 && parseInt(num) <= 255;
}

知识点:

  • eval() 函数会将传入的字符串当做 JavaScript 代码进行执行。

这种方法比较巧妙,也比较简单直观。

四、将字符串转换为驼峰格式

描述:

css 中经常有类似 background-image 这种通过 - 连接的字符,通过 javascript 设置样式的时候需要将这种样式转换成 backgroundImage 驼峰格式,请完成此转换功能

  1. - 为分隔符,将第二个起的非空单词首字母转为大写
  2. -webkit-border-image 转换后的结果为 webkitBorderImage

示例:

输入:'font-size'

输出:fontSize

方案:

function cssStyle2DomStyle(sName) {
    let str = "";
    // 通过-分割字符串,获得分割后的数组
    const arr = sName.split("-");
    // 如果数组第一位为空,则将其删除
    if (arr[0] === "") {
        arr.shift();
    }
    
    for (let i = 0; i < arr.length; i++) {
        if (i === 0) {
            str += arr[i];
        } else {
            str += arr[i][0].toUpperCase() + arr[i].slice(1);
        }
    }
    return str;
}

知识点:

  • split() 方法使用指定的分隔符字符串将一个String对象分割成子字符串数组,以一个指定的分割字串来决定每个拆分的位置。

    const arr = "a-b-c".split("-");
    console.log(arr); // [ 'a', 'b', 'c' ]
    
  • shift() 方法会删除数组的第一个元素并返回删除的这个元素,该方法会改变原数组。

  • toUpperCase() 方法将字符串转换成大写形式并返回。

  • slice(a,b) 方法截取字符串,从下标a截取到下标b(包括下标为a的元素不包括下标b的元素),如果不指定a代表从索引 0 开始,不指定b则代表截取到最后(包含最后一个元素)。a为负值时则表示从原数组中的倒数第几个元素开始提取。

五、实现简易购物车

描述:

HTML模块为一个简化版的购物车,tbody为商品列表,tfoot为统计信息,系统会随机在列表中生成一些初始商品信息
1、请完成add函数,在列表后面显示items商品信息。参数items{name: String, price: Number}组成的数组
2、请完成bind函数,点击每一行的删除按钮(包括通过add增加的行),从列表中删除对应行
3、请注意同步更新统计信息,价格保留小数点后两位
4、列表和统计信息格式请与HTML示例保持一致
5、不要直接手动修改HTML中的代码
6、不要使用第三方库

方案:

HTML:

<table id="jsTrolley">
    <thead><tr><th>名称</th><th>价格</th><th>操作</th></tr></thead>
    <tbody>
        <tr><td>产品1</td><td>10.00</td><td><a href="javascript:void(0);">删除</a></td></tr>
        <tr><td>产品2</td><td>30.20</td><td><a href="javascript:void(0);">删除</a></td></tr>
        <tr><td>产品3</td><td>20.50</td><td><a href="javascript:void(0);">删除</a></td></tr>
    </tbody>
    <tfoot><tr><th>总计</th><td colspan="2">60.70(3件商品)</td></tr></tfoot>
</table>
<!-- 测试 -->
<button onclick="add([{name: 'Ailjx', price: 3}])">增加</button>

CSS:

body,
html {
    padding: 0;
    margin: 0;
    font-size: 14px;
    color: #000000;
}

table {
    border-collapse: collapse;
    width: 100%;
    table-layout: fixed;
}

thead {
    background: #3d444c;
    color: #ffffff;
}

td,
th {
    border: 1px solid #e1e1e1;
    padding: 0;
    height: 30px;
    line-height: 30px;
    text-align: center;
}

JavaScript:

function add(items) {
   let tbody = document.getElementsByTagName('tbody')[0];

   items.forEach((item) => {
       // 创建tr节点
       let tr = document.createElement('tr');
       tr.innerHTML = `<td>${item.name}</td><td>${item.price.toFixed(2)}</td><td><a href="javascript:void(0);">删除</a></td>`;
       // 将创建的tr添加到tbody中
       tbody.appendChild(tr);

   })
   // 调用更改统计价格和数量的函数
   changePrice();
}

function bind() {
   let tbody = document.getElementsByTagName('tbody')[0];
   // 给tbody添加点击事件
   tbody.onclick = function (e) {
       let target = e.target
       // 如果点击的是删除按钮
       if (target.innerText == "删除") {
           // Element.remove() 方法,把对象从它所属的 DOM 树中删除。
           target.parentNode.parentNode.remove();
           // 调用更改统计价格和数量的函数
           changePrice();
       }
   }
}

// 更改统计价格和数量的函数
function changePrice() {
   let tbody = document.getElementsByTagName('tbody')[0];
   let tftext = document.getElementsByTagName('tfoot')[0].children[0].children[1];

   let total = 0;
   // 统计总价
   for (let i = 0; i < tbody.children.length; i++) {
       // parseFloat() 函数解析一个参数(必要时先转换为字符串)并返回一个浮点数。
       total += parseFloat(tbody.children[i].children[1].innerText);
   };
   // toFixed(digits) 方法使用定点表示法来格式化一个数值。参数digits表示小数点后数字的个数
   // Element.childElementCount 只读属性返回一个无符号长整型数字,表示给定元素的子元素数。
   tftext.innerText = `${total.toFixed(2)}(${tbody.childElementCount}件商品)`;
}

效果演示:

在这里插入图片描述

结语

这篇文章的所有内容都出自于牛客网的JS篇题库:
在这里插入图片描述

牛客网的JS题库非常贴合实际的,在写的过程中自己查漏补缺,收获了很多,强烈将牛客网推荐给大家!

如果本篇文章对你有所帮助,还请客官一件四连!❤️

基础不牢,地动山摇! 快来和博主一起来牛客网刷题巩固基础知识吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

layui数据表格的使用(前端和后端)

数据表格&#xff08;纯前端&#xff09; 快速使用 首先需要引入layui的css和js <link rel"stylesheet" href"../static/layui/css/layui.css"> <script src"../static/layui/layui.js" charset"utf-8"></script>…

如何搭建vue框架-1

提示&#xff1a;前端新人&#xff0c;初来乍到&#xff0c;若文章写的不好大家多包涵。 文章目录前言一、vue是什么&#xff1f;二、ElementUI是什么&#xff1f;三、搭建前的准备四、安装步骤1.安装webpack2.安装vue-cli3.通过vue-cli构建项目4.启动项目5.其他总结前言 基于…

element-ui表格编辑

前言&#xff1a; 准备&#xff1a; element-uivue3vscode 实现步骤&#xff1a; 数据标定打开激活编辑保存 1. 设定需要编辑的表格单元格是否编辑标识 在请求后台表格数据时进行一个二次包装&#xff0c;如果后端已经处理则不需要在进行包装&#xff08;此处包装是否编辑…

手撕前端面试题【javascript~模板字符串、类继承、参数解析器、生成页码等】

前端的那些基本标签&#x1f353;&#x1f353;模板字符串&#x1f353;&#x1f353;类继承&#x1f353;&#x1f353;参数解析器&#x1f353;&#x1f353;生成页码&#x1f353;&#x1f353;js中哪些操作会造成内存泄漏?html页面的骨架&#xff0c;相当于人的骨头&#…

react router6.x官方DEMO

Tutorial v6.4.2 | React Router 初始化项目 import React from "react"; import ReactDOM from "react-dom/client"; import {createBrowserRouter,RouterProvider,Route, } from "react-router-dom"; import "./index.css";const …

用CSS设置颜色、背景和图像效果

&#x1f4dc;个人简介 ⭐️个人主页&#xff1a;微风洋洋&#x1f64b;‍♂️ &#x1f351;博客领域&#xff1a;编程基础&#x1f4a1;,后端&#x1f4a1;,大数据,信息安全 &#x1f345;写作风格&#xff1a;干货,干货,还是tmd的干货 &#x1f338;精选专栏&#xff1a;【J…

js数组常用方法(19种)|你会的到底有多少呢?

一、改变原数组的方法 1.push&#xff08;&#xff09; 末尾添加数据 语法: 数组名.push(数据) 作用: 就是往数组末尾添加数据 返回值: 就是这个数组的长度 //push var arr [10, 20, 30, 40] res arr.push(20) console.log(arr);//[10,20,30,40,20] console.log(res);//52. …

【Cesium】使用TLE轨道两行数计算轨道信息,并生成CZML格式文件

TLE为轨道两行数&#xff0c;简单的说是用两行数字表示轨道的相关信息&#xff0c;本文即用轨道两行数来计算任一时刻卫星的位置信息和速度信息&#xff0c;并生成CZML文件能够读取的格式 1、satellite.js库简介 简而言之&#xff0c;satellite.js库可以根据TLE轨道两行数&…

vue 项目适配笔记本1920*1080 125%缩放

前言 在台式机上开发pc端项目时&#xff0c;由于是1920*1080的分辨路和100缩放&#xff0c;看起来是没有问题。在笔记本上有问题 因为现在很多14寸的笔记本&#xff0c;出厂默认就是125%或150%的显示。导致很多时候我们的项目&#xff0c;自己开发的时候都是按照100%比例来开发…

Vue使用Serial连接串口

本来只是随手记录一下&#xff0c;发现看的人多了&#xff0c;想着还是修复一下bug吧&#xff0c;供各位看官指正 2022-10-24本次更新: 1、修复在不支持Serial的情况下&#xff0c;控制台报错 2022-09-19本次更新: 1、修复了传输数据接收分隔的情况(增加数据缓存) 2、修复串口连…

【中兴】web训练营~一文带你走进前端 | 百图制作

&#x1f4e2;作者简介&#xff1a;物联网领域创作者&#xff0c;&#x1f3c5;阿里云专家博主&#x1f3c5; &#x1f3c5;华为云享专家&#x1f3c5; ✒️个人主页&#xff1a;Choice~ &#x1f310;格言&#xff1a;可正因为难&#xff0c;才有价值&#xff01;&#x1f536…

Linux 使用Nginx部署web(vue、react)项目

前言 本文基于&#xff1a;操作系统 CentOS 7.6 使用的工具&#xff1a;Xshell7、Xftp7 1.安装所需依赖 安装gcc yum -y install gcc安装pcre、pcre-devel yum -y install pcre pcre-devel安装zlib、zlib-devel yum install -y zlib zlib-devel安装openssl、openssl-dev…

【uni-app】点击左上角返回按钮,弹出弹窗或者是携带参数返回上一页

目录 1、弹出弹窗 2、把这一页的数据带回到上一页&#xff08;获取下一页的数据 &#xff09; 3、跳转页面并携带参数&#xff0c;接受页获取参数 1、弹出弹窗 当我返回上一页的时候需要做一个判断是否需要保存 onBackPress 只支持APP和H5 但不支持小程序 &#xff0c;可以…

Java web—访问http://localhost:8080/xx/xx.jsp报404错误问题

由于我们在eclipse ee中把项目部署在web端经常会出现报404错误。 原因为&#xff1a; 404状态码是一种http状态码&#xff0c;其意思是&#xff1a; 所请求的页面不存在或已被删除。通俗的讲就是当用户输入了错误的链接时&#xff0c;返回的页面。 以下描述几种情况&#xff1a…

IDEA从零到精通(24)之lombok插件的安装与使用

文章目录作者简介引言导航概述安装插件使用小结导航热门专栏推荐作者简介 作者名&#xff1a;编程界明世隐 简介&#xff1a;CSDN博客专家&#xff0c;从事软件开发多年&#xff0c;精通Java、JavaScript&#xff0c;博主也是从零开始一步步把学习成长、深知学习和积累的重要性…

【Vue】 组件封装

目录1 组件封装1.1 全局注册1.2 局部注册1.2.1 命名1.2.2 引用组件1.2.2.1 传统写法1.2.2.2 setup1.2.2.3 easycom1.3 父子组件间的数据传递1.3.1 子组件 data() 中设置数据1.3.2 父组件通过 prop 将数据传递给子组件1.3.3 子组件不能直接修改 prop 中的值1.3.4 子组件通过 emi…

Pinia中action使用详解

actions的使用 动作相当于组件中的方法。它们可以使用actionsin 属性进行定义。 并且在pinia中的action既可以有同步函数也可以有异步函数。 在actions中可以通过this访问该仓库所有实例 export const useUsers defineStore(users,{state:()>{userData:null},actions:{a…

【SpringMVC】集成Web、MVC执行流程、数据响应、数据交互

文章目录前言一.Spring集成Web二.对于SpringMVC的理解三.MVC执行流程&#xff08;&#x1f3f3;️‍&#x1f308;&#xff09;1.组件解析2.RequestMapping四.SpringMVC数据响应页面跳转回写数据五.SpringMVC获得请求数据前言 SpringMVC确实很麻烦&#xff0c;零碎的点太多 一…

小程序自定义tabbar导航栏、动态控制tabbar功能实现(uniapp)

uniapp开发小程序&#xff0c;不同角色/已登录未登录&#xff0c;都有不一样的底部导航栏&#xff0c;这些情况下就需要自行定义tabbar&#xff0c;从而实现动态tabbar的实现。 1.首先我们需要在pages.json配置tabbar 我这里并没有开启custom(自定义)&#xff0c;不开启的话&a…

vue实现思维导图

介绍 前景&#xff1a; 仿幕布实现思维导图效果 技术实现&#xff1a;jsmind 完整代码&#xff1a;vue-jsmind 参考文章&#xff1a; 在vue中使用jsmind组织架构或思维导图 实现效果&#xff1a; 功能描述&#xff1a; 编辑、删除、插入、拖拽、展开/收起节点分布结构切换…