JavaScript二进制在多选type的应用
需求上传服务类型的type,数据库要求type必须位整型和整型的字符串:如type=100或者type=“100”;
刚接到需求,我也很懵逼,以前没做过,以前都是类似typeArr=【3,1,2,5】,选中什么给添加到数组typeArr,
然后发给服务器。看了后端C语言大神的代码,我就懂了,其实还可以这样。
先看看数据格式:
var data=[{
title:'角色设计', click:false,subtype:1
},{
title:'概念设计', click:false,subtype:2
},{
title:'立绘', click:false,subtype:3
},{
title:'卡牌', click:false,subtype:4
},{
title:'CG', click:false,subtype:5
},{
title:'场景', click:false,subtype:6
},{
title:'海报', click:false,subtype:7
},{
title:'条漫', click:false,subtype:8
},{
title:'Q版', click:false,subtype:9
},{
title:"图标", click:false,subtype:10
},{
title:"封面", click:false,subtype:11
},{
title:"插图", click:false,subtype:12
},{
title:"头像", click:false,subtype:13
},{
title:"壁纸", click:false,subtype:14
},{
title:"印花", click:false,subtype:15
},{
title:"UI", click:false,subtype:16
},{
title:"日韩系", click:false,subtype:17
},{
title:"欧美系", click:false,subtype:18
},{
title:"中国风", click:false,subtype:19
},{
title:"写实", click:false,subtype:20
}];
//类似位运算的封装,参数说明:arr是data
function enBitFn(arr) {
let bitArr=[],//二进制数组
bitArrStr;//二进制字符串
for(let i in arr){
bitArr.push(0) //根据数组长度push n个0 (注意不应该超过32位)
}
let choseArr=arr.filter(function (ele,index,arr) {
return ele.click===true //检测是否点击了
});
for(let j in choseArr){
bitArr[choseArr[j].subtype-1]=1 //取点击后的数组的subtype 即是bitArr的下标的值修改为1
}
bitArrStr=(bitArr.join()).replace(/\,/g,'');//数组转换为字符串
return parseInt(bitArrStr,2) //2进制字符串转10进制
};
//位运算解析,参数说明num是运算封装时的十进制,arr是data
function deBitFn(num,arr) {
let toBit=num.toString(2),//十进制数字转二进制字符串
bitArr=toBit.split(''),//二进制数组
newArr=[];//查询结果
if(bitArr.length<arr.length){//如果二进制数组长度不足原来的需要补足
let num=arr.length-bitArr.length;//长度差
for(let i=0 ;i<num;i++){
bitArr.splice(0,0,'0')//补足,向数组最前面循环添加0,补足长度
}
}
for (let i in bitArr){//循环二进制数组
if(bitArr[i]==='1'){//如果等于1的说明是之前选中的
newArr.push(arr[i]) //arr查询的值返回给newArr
}
}
return newArr
};
//调用
//发送给服务器端type=num
var num=enBitFn(data) //返回十进制num;type=num,发送给服务器存数据库;
//接收服务器端的type进行解析
var type=$.ajax();//ajax服务器获取
var newArrData=deBitFn(type,arr) //解析后返回之前选中的值
知识点:
var a = 1010;
var bitNum=a.toString(2); //转成二进制
var num=parseInt( bitNum,2) ;//转成十进制