You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jQuery如何对比二维套餐数组与一维选中模块数组并返回匹配套餐名称

实现思路

要实现完全匹配且不受模块选择顺序影响,最便捷的方案是将两侧的模块集合统一处理为排序后拼接的字符串作为匹配标识,直接对比标识是否相等即可完成校验,实现简单且性能优异。

代码优化建议

1. 套餐数组初始化优化

原逻辑中套餐的modules字段存储的是逗号分隔字符串,每次匹配都要拆分处理,建议初始化时直接预生成匹配用的标准键,减少后续匹配时的重复计算:

const packages_array = [];
$("#packages .package").each(function() {
  const packageTitle = $(this).data('title');
  // 拆分模块字符串为数组,排序后拼接为标准匹配键,消除顺序影响
  const moduleArr = $(this).data('modules').split(',').sort();
  const matchKey = moduleArr.join(',');
  packages_array.push({
    title: packageTitle,
    modules: moduleArr, // 可选:保留数组格式供其他业务使用
    matchKey: matchKey // 预存匹配键,后续对比直接使用
  });
});

2. 用户选中模块处理优化

获取用户选中模块时,同样处理为和套餐匹配键格式一致的字符串:

const modules_array = [];
$(".modules .module.active").each(function() {
  modules_array.push($(this).data('title'));
});
// 排序后拼接,和套餐匹配键格式统一
const userMatchKey = modules_array.sort().join(',');
匹配逻辑实现

直接遍历套餐数组匹配对应键即可返回结果:

// 匹配函数,匹配成功返回套餐标题,失败返回null
function getMatchedPackage(userMatchKey, packageList) {
  const matchedPackage = packageList.find(item => item.matchKey === userMatchKey);
  return matchedPackage ? matchedPackage.title : null;
}

// 调用示例
const result = getMatchedPackage(userMatchKey, packages_array);
if (result) {
  console.log('匹配到套餐:', result);
} else {
  console.log('无符合条件的套餐');
}
特殊场景兼容

如果业务中模块名称可能包含逗号,将拼接用的分隔符替换为不会出现在模块名中的字符即可,比如用||作为分隔符:

// 生成匹配键时改为
const matchKey = moduleArr.join('||');

内容的提问来源于stack exchange,提问作者Senne Vandenputte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:06:00