
本文旨在探讨在J*aScript中如何灵活地检查一个数字的组成数字(或数字序列)是否存在于另一个数字中,特别是在传统`includes()`方法和简单正则表达式无法满足需求时。我们将通过动态正则表达式和数组高阶函数,提供两种主要解决方案:一种用于顺序无关的数字集合匹配,另一种用于顺序相关的数字序列匹配,并进一步展示如何扩展到检查整个数组的匹配情况。
在J*aScript开发中,我们有时会遇到一个特殊的需求:判断一个数字(例如 789)的构成数字是否“存在”于另一个更长的数字(例如 7189)中。这里的“存在”可能意味着 789 的所有数字(7、8、9)都可以在 7189 中找到,无论它们的顺序如何;也可能意味着这些数字必须以特定的顺序出现。传统的 Array.prototype.includes() 方法仅适用于精确的值匹配,而简单的正则表达式如 /(123)|(456)|(789)/g 只能匹配连续的子字符串,无法满足这种灵活的数字拆解与匹配需求。
考虑以下场景: 我们有一个“获胜数字”数组 winArray = [123, 456, 789],以及一个用户输入的数字 mergeUserArray = [7189]。我们希望判断 mergeUserArray 中的数字是否包含了 winArray 中某个数字的所有组成部分。
let winArray = [123, 456, 789];
let mergeUserArray = [7189]; // 期望匹配 789
// 传统 includes() 方法无法满足需求
if (winArray.includes(Number(mergeUserArray))) {
console.log("Number matched"); // 不会匹配,因为 7189 不等于 789
} else {
console.log("Number not matched"); // 输出 "Number not matched"
}
// 简单正则表达式也无法匹配非连续的数字
let regxWinArray = /(123)|(456)|(789)/g;
// '7189'.match(regxWinArray) 将返回 null在这种情况下,我们需要一种更精细的匹配策略。
此方法用于判断 winArray 中的某个数字(item)的所有组成数字是否都存在于 mergeUserArray 中的某个数字(what)中,而不关心它们的排列顺序。
核心思路:
示例代码:
let winArray = [123, 456, 789];
let mergeUserArray = [7189]; // 期望匹配 789
let matchFound = winArray.some(item => { // 遍历 winArray 中的每个获胜数字
return mergeUserArray.some(what => { // 遍历 mergeUserArray 中的每个用户数字
const regex = new RegExp(`[${item}]`, 'g'); // 创建动态正则表达式,匹配 item 的任一数字
// 尝试匹配 what 的字符串形式,并检查匹配到的字符数量是否等于 item 的字符数量
// 例如:item = 789, what = 7189
// regex = /[789]/g
// '7189'.match(regex) 会得到 ['7', '8', '9']
// 其长度为 3,与 '789'.length 相等,因此匹配成功
return what.toString().match(regex)?.length === item.toString().length;
});
});
console.log("顺序无关匹配结果:", matchFound); // 输出: 顺序无关匹配结果: true此方法在顺序无关的基础上,进一步要求 winArray 中的数字 item 的所有组成数字在 mergeUserArray 中的数字 what 中出现时,它们的相对顺序也必须与 item 相同,并且这些被匹配到的数字拼接后能形成 item。
当贝AI
免登录体验DeepSeek满血版
888
查看详情
核心思路:
示例代码:
let winArray = [123, 456, 789];
const hasMatchStrict = mergeUserArray => winArray.some(item => {
return mergeUserArray.some(what => {
const regex = new RegExp(`[${item}]`, 'g'); // 匹配 item 的任一数字
// 匹配 what 的字符串形式,并将匹配到的字符拼接
// 例如:item = 789, what = 7189
// '7189'.match(/[789]/g) 得到 ['7', '8', '9']
// ['7', '8', '9'].join('') 得到 '789'
// '789' === '789' 为 true,匹配成功
// 例如:item = 189, what = 1987
// '1987'.match(/[189]/g) 得到 ['1', '9', '8']
// ['1', '9', '8'].join('') 得到 '198'
// '198' === '189' 为 false,不匹配
return what.toString().match(regex)?.join('') === item.toString();
});
});
console.log("严格顺序匹配 [7189]:", hasMatchStrict([7189])); // 输出: 严格顺序匹配 [7189]: true
console.log("严格顺序匹配 [1897]:", hasMatchStrict([1897])); // 输出: 严格顺序匹配 [1897]: false (因为 1897 中没有 189 的顺序)
console.log("严格顺序匹配 [12345]:", hasMatchStrict([12345])); // 输出: 严格顺序匹配 [12345]: true (因为 12345 中有 123 的顺序)如果我们需要确保 mergeUserArray 中的 所有 数字都能在 winArray 中找到至少一个符合条件的匹配项,我们可以结合 Array.prototype.every() 方法。
核心思路: 使用 every() 遍历 mergeUserArray,确保每个元素都能通过 winArray.some(...) 找到一个匹配。这里我们沿用方法一(顺序无关)的匹配逻辑。
示例代码:
let winArray = [123, 456, 789];
let mergeUserArrayAll = [7189, 654]; // 期望 7189 匹配 789,654 匹配 456
let allMatched = mergeUserArrayAll.every(what => { // 遍历 mergeUserArrayAll 中的每个用户数字
return winArray.some(item => { // 检查它是否能在 winArray 中找到一个匹配
const regex = new RegExp(`[${item}]`, 'g');
return what.toString().match(regex)?.length === item.toString().length;
});
});
console.log("所有用户数字是否都找到匹配 (顺序无关):", allMatched); // 输出: 所有用户数字是否都找到匹配 (顺序无关): true
let mergeUserArrayPartial = [7189, 100]; // 100 无法匹配 winArray 中的任何数字
let allMatchedPartial = mergeUserArrayPartial.every(what => {
return winArray.some(item => {
const regex = new RegExp(`[${item}]`, 'g');
return what.toString().match(regex)?.length === item.toString().length;
});
});
console.log("所有用户数字是否都找到匹配 (部分匹配):", allMatchedPartial); // 输出: 所有用户数字是否都找到匹配 (部分匹配): false
序 拼接起来后与 item 完全一致。通过上述方法,我们可以灵活地处理数字集合或序列的匹配需求,超越了简单 includes() 和固定正则表达式的局限性,使得代码在处理此类业务逻辑时更加健壮和高效。选择哪种匹配逻辑取决于具体的业务需求:是只关心数字的存在性(顺序无关),还是也关心它们的排列顺序。
以上就是J*aScript 中高效检查数字集合或序列是否存在于另一个数字中的详细内容,更多请关注其它相关文章!
# 都在
# 荷城网站建设设计
# 湘乡营销推广
# 新余网站营销推广代理商
# 泰安seo网络科技
# 保定陶瓷行业网站建设
# 感知觉营销推广
# 网站建设合同注意什么
# 网站建设 乐云seo
# 信息化关键词排名意义
# 保险行业营销推广渠道
# 能在
# 中有
# javascript
# 中找到
# 有什么
# 的是
# 适用于
# 遍历
# 是否存在
# 排列
# javascript开发
# win
# 正则表达式
# java
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
Python自动化抓取GBGB赛狗比赛结果:日期范围与赛道筛选教程
解决VS Code中Python版本冲突与输出异常的指南
什么是Satis,如何用它搭建一个私有的composer仓库?
视频号视频怎么免费保存到相册?保存到相册需要注意什么?
睡觉时心跳快是什么原因 夜间心悸如何应对
Highcharts雷达图轴线交点数值标注指南
PHP安全加载非公开目录图片与动态内容类型处理指南
百度输入法在AutoCAD中无法输入中文怎么办_百度输入法CAD输入异常解决方法
《edge浏览器》关闭翻译功能方法
word表格如何按某一列内容进行排序_Word表格按列排序方法
怎么恢复删除的电脑文件_数据恢复软件使用教程
AO3中文版手机快速通道_AO3最新稳定链接更新
优化Leaflet弹出层图片显示:条件渲染策略
解决Go encoding/json 将JSON大数字解析为浮点数的问题
OPPO手机参数配置如何开启护眼模式_OPPO手机参数配置护眼模式开启指南
解决PHP MySQL数据库更新无响应:SQL查询语法错误解析
Win10运行窗口在哪里打开 Win10调出运行命令框快捷键【技巧】
作业帮网页版不用下载入口 在线问老师快速答疑
基于键值条件高效映射 Pandas DataFrame 多列数据
《浙里办》电子发票开具方法
漫蛙manwa2网页版书签同步链接_漫蛙manwa多设备登录入口
申通快递查询 申通物流快递单实时查询入口
在React中正确处理HTML input type="number"的数值类型
我的世界游戏平台入口 我的世界官方官网直达链接
CSS如何在页面中引入重置样式_使用Normalize.css或Reset.css统一浏览器默认样式
Linux如何开发轻量级数据服务模块_Linux服务化设计
疯狂小鸟微信小游戏入口 疯狂小鸟网页版秒玩
C++二维数组动态分配方法_C++指针与数组内存布局
抖音如何进行蓝V认证 抖音企业号申请所需资料与流程
J*aScript:从子元素中批量移除特定CSS类
263企业邮箱如何设置邮件转发功能
TikTok视频播放中断怎么办 TikTok播放异常修复方法
《豆瓣》私信用户方法
《糖豆》添加舞曲方法
繁花漫画使用教程
Excel宏怎么删除_Excel中删除宏的详细操作流程
暴风影音官网正式版_暴风影音手机版官网下载安卓
qq音乐官方网站入口_qq音乐在线听歌网页版链接
TikTok收藏夹无法删除视频如何解决 TikTok收藏管理优化方法
嘴唇干裂起皮怎么办 唇部护理与预防干裂的方法【详解】
J*aScript深度克隆:实现高效、健壮与安全的复杂对象复制
MySQL多重JOIN技巧:高效关联同一表获取多角色信息
原子笔记app误删找回教程
Coolpad5890 ROM刷机包
Python实时数据流中高效查找最大最小值
发博客与长微博技巧
追剧达人如何发弹幕
悟空浏览器如何恢复关闭的标签页 悟空浏览器撤销关闭网页快捷键设置
Python中深度嵌套字典与列表的数据提取与条件过滤指南
C++如何使用CMake构建项目_C++ CMakeLists.txt编写入门教程
2025-12-12
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。