基于JavaScript实现多博彩网站赛事赔率无重复组合生成问询
实现方案
核心思路
要生成满足「三个赛果分别来自不同博彩网站」的赔率组合,分两步走:
- 先把分散在各个网站的赛果按类型(主队胜、客队胜、平局)归类,方便后续组合匹配;
- 遍历所有可能的赛果组合,筛选出三个赛果所属网站完全不重复的有效组合。
代码实现
// 假设你的原始数据存储在这个变量里 const bookmakers = [ { "key": "betmgm", "title": "BetMGM", "last_update": "2022-12-14T04:30:40Z", "markets": [ { "key": "h2h", "outcomes": [ { "name": "AC Milan", "price": 138 }, { "name": "Tottenham Hotspur", "price": 200 }, { "name": "Draw", "price": 225 } ] } ] }, { "key": "barstool", "title": "Barstool Sportsbook", "last_update": "2022-12-14T04:30:22Z", "markets": [ { "key": "h2h", "outcomes": [ { "name": "AC Milan", "price": 130 }, { "name": "Tottenham Hotspur", "price": 220 }, { "name": "Draw", "price": 230 } ] } ] }, { "key": "twinspires", "title": "TwinSpires", "last_update": "2022-12-14T04:17:45Z", "markets": [ { "key": "h2h", "outcomes": [ { "name": "AC Milan", "price": 130 }, { "name": "Tottenham Hotspur", "price": 220 }, { "name": "Draw", "price": 230 } ] } ] } ]; // 1. 按赛果类型整理数据:key是赛果名称,value是该赛果对应的所有网站赔率信息 const outcomeMap = {}; bookmakers.forEach(bookmaker => { const h2hMarket = bookmaker.markets.find(m => m.key === 'h2h'); if (!h2hMarket) return; // 跳过没有h2h市场的网站 h2hMarket.outcomes.forEach(outcome => { const { name, price } = outcome; if (!outcomeMap[name]) outcomeMap[name] = []; outcomeMap[name].push({ bookMaker: bookmaker.title, name, price }); }); }); // 提取三类赛果的赔率列表(这里要和你的赛果名称对应,比如主队是AC Milan,客队是Tottenham Hotspur) const [homeOdds, awayOdds, drawOdds] = [ outcomeMap["AC Milan"], outcomeMap["Tottenham Hotspur"], outcomeMap["Draw"] ]; // 2. 生成所有符合要求的组合:三个赛果来自不同网站 const validCombinations = []; if (homeOdds && awayOdds && drawOdds) { homeOdds.forEach(home => { awayOdds.forEach(away => { if (home.bookMaker === away.bookMaker) return; // 网站重复,跳过 drawOdds.forEach(draw => { if (draw.bookMaker === home.bookMaker || draw.bookMaker === away.bookMaker) return; // 三个网站都不重复,加入有效组合 validCombinations.push([home, away, draw]); }); }); }); } // 输出结果,和你期望的格式完全一致 console.log(validCombinations);
关键细节说明
- 数据整理:通过
outcomeMap把同一赛果的所有网站赔率归到一起,避免后续重复遍历原始数组; - 组合筛选:三重循环里加入网站名称的判断,确保每个组合里的三个赛果分别来自不同网站;
- 边界处理:先判断三类赛果的赔率列表是否存在,避免出现
undefined报错;如果网站总数少于3个,自动不会生成任何有效组合。
扩展优化
如果需要筛选出最优赔率组合(比如每个赛果选最高赔率且网站不重复),可以在生成validCombinations后,通过计算组合的预期收益或者直接比较赔率值来排序筛选:
// 示例:找出每个赛果赔率最高的有效组合(如果存在) const bestCombination = validCombinations.sort((a, b) => { // 计算组合的总赔率权重(这里可以换成你的数学公式逻辑) const totalA = a.reduce((sum, item) => sum + item.price, 0); const totalB = b.reduce((sum, item) => sum + item.price, 0); return totalB - totalA; })[0]; console.log("最优组合:", bestCombination);
内容的提问来源于stack exchange,提问作者Daniel Alves
相关产品推荐
相关产品推荐

