首页 > 其他分享 >js有效括号匹配

js有效括号匹配

时间:2024-06-05 15:01:22浏览次数:27  
标签:arr right const item js 括号 匹配 left

// 定义一个括号映射
const bracketMap = [
    {
        left: '[', 
        right: ']'
    },
    {
        left: '<',
        right: '>'
    },
    {
        left: '(',
        right: ')'
    },
    {
        left: '【',
        right: '】'
    },
    {
        left: '(',
        right: ')'
    },
    {
        left: '《',
        right: '》'
    },
    {
        left: '{',
        right: '}'
    }
]
function match(params) {
    const stack = [];
    const leftMap = bracketMap.map(item => item.left);
    const rightMap = bracketMap.map(item => item.right);
    // 将字符串形式的括号集合转为数组
    const arr = params.split('');
    // 循环每一个括号,并做判断
    for (const key in arr) {
        // 左括号入栈
        if (leftMap.includes(arr[key])) {
            stack.push(arr[key]);
        }
        // 右括号 && 右括号在映射中的下标等于栈顶括号(栈顶括号:是左括号,因为只有左括号执行了进入栈操作)在映射中的下标,说明括号匹配,那么执行出栈操作
        else if (rightMap.includes(arr[key]) && (bracketMap.findIndex(item => item.right === arr[key]) === bracketMap.findIndex(item => item.left === stack[stack.length - 1]))) {
            stack.pop(arr[key]);
        }
        // 在循环中未结束,栈为空,匹配失败
        else (!stack.length) {
            return 'ERROR';
        }
    }
    // 最后判断,栈为空,则表示匹配成功;反之,则匹配失败
    return stack.length ? 'ERROR' : 'SUCCESS';
}
// 测试case:
const str = '[<(《》【】(([【[[]]《》】()])))>]'; // true
// const str = '(){}[]';                        //  true
// const str = '([{}])';                        //  true
// const str = '(}';                            //  false
// const str = '[(])';                          //  false
// const str = '[({})](]';                      //  false
console.log(match(str));

 

标签:arr,right,const,item,js,括号,匹配,left
From: https://www.cnblogs.com/zhulongxu/p/18233052

相关文章

  • 【JS】JavaScript编程语言-谷歌浏览器调试之前端代码(2024-06-05)
    1、在浏览器中调试调试是指在一个脚本中找出并修复错误的过程。所有的现代浏览器和大多数其他环境都支持调试工具——开发者工具中的一个令调试更加容易的特殊用户界面。它也可以让我们一步步地跟踪代码以查看当前实际运行情况。在这里我们将会使用Chrome(谷歌浏览器)。2......
  • js的 addEventListener如果添加的是相同名称的事件,会被覆盖吗
    在JavaScript中,使用addEventListener方法向元素添加事件监听器时,如果有多个相同的事件名称(比如多次调用addEventListener("click",function)),这些监听器不会互相覆盖,而是会累加。这意味着所有为同一事件类型注册的监听器都会按照添加的顺序依次触发,而不是只有最后一个生效。这......
  • js一般私有的方法如何命名
    在JavaScript中,对于私有方法的命名,尽管语言本身并不强制任何命名规范,但有一些广泛接受的约定来表明方法或属性的私有性。这些约定主要是为了提高代码的可读性和维护性,让其他开发者能够快速识别出哪些方法或属性是设计为内部使用的。以下是几种常见的私有方法命名约定:下划线前......
  • yarn 命令如何查看node_modules中的某个依赖包是被package.json中的哪个包所使用的?
    Yarn本身并没有直接提供一个命令来查看node_modules中的某个依赖包是由package.json中的哪个包直接或间接引入的。但是,你可以通过一些间接的方式来获取这些信息:手动检查:打开node_modules中你想查询的依赖包的package.json文件,查看它的name字段确认包名。然后回到你的项目根......
  • 【vuejs】keep-alive组件的原理讲解和使用讲解
    1.keep-alive简介Vue.js框架中的<keep-alive>组件是一个用于缓存组件实例的内置组件,它使得组件在不活动时保持其状态,从而提高应用的性能和用户体验。当使用动态组件<component>切换视图时,不在显示的组件实例会被销毁并重新创建,这会导致状态丢失。而<keep-alive>可......
  • js table sort
    备份,后面做个整理letzoneOverviewData=[]letsortFields=[]constgetSortedRows=()=>{letrows=[...zoneOverviewData];constascFields=sortFields.filter((z)=>z.sort==="asc").sort((a,b)=>(a.sortIndex>b.sor......
  • SpringBoot+微信支付-JSAPI{微信支付回调}
    引入微信支付SDKMaven:com.github.wechatpay-apiv3:wechatpay-java-core:0.2.12Maven:com.github.wechatpay-apiv3:wechatpay-java:0.2.12响应微信回调的封装@Getter@Setter@NoArgsConstructor@AllArgsConstructor@Accessors(chain=true)publicclassWxNotifyVo{......
  • 计算机毕业设计项目推荐,28259校园信息交流平台的设计与实现(开题答辩+程序定制+全套文
    摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,校园信息交流平台被用户普遍使用,为方便用户能够可以随时进行校园信息交流平台的数据信息管理,特开发了基于校园信息交流......
  • 计算机毕业设计项目推荐,28326 校园商店管理系统的设计与实现(开题答辩+程序定制+全套文
    摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,校园商店当然也不能排除在外。校园商店是以实际运用为开发背景,运用软件工程原理和开发方法,采用Java技术构建的一个管理系统。整个开发过程首先对软件系统......
  • js 中常用的判空写法
    在JavaScript中,判空通常是为了避免null或undefined值导致的错误。以下是一些常用的判空写法:1.普通变量letvalue=...;if(value===null||value===undefined){//value是null或undefined}2.Stringletstr=...;if(!str||str.length===0){......