javascript模拟订火车票和退票示例


Posted in Javascript onApril 24, 2014

之前看到有人分析12306后台的逻辑。。火车票的预定和退订不同于普通的购物。
一个难题就是火车票可以分站来卖。比如,一张北京到上海的火车票,沿途可以有很多站,可以北京-济南,济南-南京...等等。如何设计数据模型来存取这些票是一个问题。而不是简单的数量+-1.

其中看到一条思路挺好:用二进制字符串来表示一张火车票,比如,北京到上海共10站,那么一张全程票初始状态表示为:'1111111111';
卖出一张全程票,则该票变为'0000000000';
卖出一张半程票,比如北京-济南三站(第一站-第三站),则票变为'0011111111';
再卖出一张半程票,比如徐州-南京(第6站-第9站),则上一张票变为:'0011100011';

退订票的逻辑就很简单了,我要退一张(徐州-南京)的票,则从票池中找到第一张不能买
(徐州-南京)的票,更改它就OK(买票的逆向).比如,找到了上面的一张票'0011100011',
退票后,此票变为(0011111111);

基本逻辑如上,12306要保证多入口,而同时数据的一致性,需要很高效的逻辑来处理查票,
买票,退票的业务,据说高峰每秒会有20万请求。将票的数据结构保存在内存中。而非数据库。
小而高效的数据结变得很重要。

if(jQuery){}else{
 //document.write
}
function Server(){
 var self = this;
 self.ticketsPool = [];
 self._init= function(number){
  if(typeof(number) != 'number')
   throw ('type error');
  for(i=0;i<number;i++){
   self.ticketsPool.push(new Ticket());
  }
 };
 //判断一张票是否可以买,通过与或运算来实现。
 //比如:订单o为北京-济南(001111111),某张票为(0000000011)(已卖出北京-南京),那么返回false
 //比如:订单o为北京-济南(001111111),某张票为(1111100011)(已卖出徐州-南京),那么返回true
 self.canBuy = function(o,t){
  var _o = ''
  for(j=0; j<o.length; j++){
   _o += o[j]=='0'?1:0;
  }
  var r1 = (parseInt(t.tic,2) | parseInt(o,2)) & parseInt(_o,2);
  var r2 = parseInt(_o,2);
  return r1 == r2;
 };
 //卖出一张票
 self.pop1Ticket = function(o){
   for(i=0;i < self.ticketsPool.length;i++){
    if(self.canBuy(o,self.ticketsPool[i])){
     self.buy(self.ticketsPool[i],o);
     return i;
   }
  };
  return -1;
 };
 //卖出票的实现,改变二进制字符串,比如'111111111'->'001111111';
 self.buy = function(t,o){
  t.tic = (parseInt(t.tic,2) & parseInt(o,2)).toString(2);
  //alert(t.tic);
 };
 //查询余票
 self.remainTics = function(o){
   var count=0;
   for(i=0;i < self.ticketsPool.length;i++){
    count += self.canBuy(o,self.ticketsPool[i])?1:0;
  };
  return count;
 }
 //退票,或 运算
 self.refund = function(o){
   for(i=0;i < self.ticketsPool.length;i++){
    if(!self.canBuy(o,self.ticketsPool[i])){
     var _o = ''
     for(j=0; j<o.length; j++){
      _o += o[j]=='0'?1:0;
     }
     self.ticketsPool[i].tic = (parseInt(self.ticketsPool[i].tic,2) | parseInt(_o,2)).toString(2);
     return i;
   } 
  };
  return -1;
 }
}
//数据模型:票
function Ticket(){
 var self = this;
 //票的初始为全程票
 self.tic = '1111111111';
}
//数据模型:订单
function Order(from, to){
 var self = this;
 var s = '';
 for(i=0;i<10;i++){
  s += (i>=from && i<to)?0:1;
 }
 return s;
}
//12306后台
Server = new Server();
//初始状态,票池有400张全程票
Server._init(400);
Javascript 相关文章推荐
JS 常用校验函数
Mar 26 Javascript
Array.prototype.slice.apply的使用方法
Mar 17 Javascript
javascript转换静态图片,增加粒子动画效果
May 28 Javascript
js+css实现文字散开重组动画特效代码分享
Aug 21 Javascript
JS动态日期时间的获取方法
Sep 28 Javascript
JS中多种方式创建对象详解
Mar 22 Javascript
vue-hook-form使用详解
Apr 07 Javascript
在 Node.js 中使用 async 函数的方法
Nov 17 Javascript
微信小程序Page中data数据操作和函数调用方法
May 08 Javascript
js实现html滑动图片拼图验证
Jun 24 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
Sep 22 Javascript
JavaScript选择器函数querySelector和querySelectorAll
Nov 27 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
Apr 23 #Javascript
jquery map方法使用示例
Apr 23 #Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
Apr 23 #Javascript
js Dialog 去掉右上角的X关闭功能
Apr 23 #Javascript
Jquery实现Div上下移动示例
Apr 23 #Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
Apr 23 #Javascript
JQuery下拉框应用示例介绍
Apr 23 #Javascript
You might like
简单介绍PHP非阻塞模式
2016/03/03 PHP
PHP convert_cyr_string()函数讲解
2019/02/13 PHP
javascript getElementsByName()的用法说明
2009/07/31 Javascript
jMessageBox 基于jQuery的窗口插件
2009/12/09 Javascript
javascript 伪数组实现方法
2010/10/11 Javascript
JSON序列化与解析原生JS方法且IE6和chrome测试通过
2013/09/05 Javascript
基于jquery实现的文字淡入淡出效果
2013/11/14 Javascript
jquery实现的下拉和收缩效果示例
2014/08/21 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
Angularjs 创建可复用组件实例代码
2016/10/09 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
使用React手写一个对话框或模态框的方法示例
2019/04/25 Javascript
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
[02:53]DOTA2英雄基础教程 山岭巨人小小
2013/12/09 DOTA
理解Python中的With语句
2015/02/02 Python
Python操作Word批量生成文章的方法
2015/07/28 Python
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
Python中import导入上一级目录模块及循环import问题的解决
2016/06/04 Python
浅析Python中yield关键词的作用与用法
2016/11/29 Python
详解python里使用正则表达式的全匹配功能
2017/10/19 Python
详解Python3中setuptools、Pip安装教程
2019/06/18 Python
python中open函数的基本用法示例
2019/09/07 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
2020/04/09 Python
PyTorch中clone()、detach()及相关扩展详解
2020/12/09 Python
Python+Xlwings 删除Excel的行和列
2020/12/19 Python
浅谈pc和移动端的响应式的使用
2019/01/03 HTML / CSS
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
印尼极简主义和实惠的在线家具店:Fabelio
2019/03/27 全球购物
团队精神演讲稿
2013/12/31 职场文书
母亲节演讲稿范文
2014/01/02 职场文书
2014党员民主评议个人总结
2014/09/10 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
Python进行区间取值案例讲解
2021/08/02 Python
python中的random模块和相关函数详解
2022/04/22 Python