字段有相同需要进行分组
function groupByAdvertisementSort(arr) {
var map = {}, dest = [];
for (var i = 0; i < arr.length; i++) {
var ai = arr[i];
if (!map[ai.sort]) {
dest.push({
sort : ai.sort,//重复字段
top : ai.top,//有利于条件
data : [ ai ]
});
map[ai.sort] = ai;
} else {
for (var j = 0; j < dest.length; j++) {
var dj = dest[j];
if (dj.sort == ai.sort) {
dj.data.push(ai);
break;
}
}
}
}
/*for(var j=0;j<dest.length;j++){
console.log(dest[j]);
}*/
return dest;
}
核心随机取值方法
function weight_rand(arr) {
//参数arr元素必须含有weight属性,参考如下所示
//var arr=[{name:'1',weight:1.5},{name:'2',weight:2.5},{name:'3',weight:3.5}];
//var arr=[{name:'1',weight:'15%'},{name:'2',weight:'25%'},{name:'3',weight:'35%'}];
//求出最大公约数以计算缩小倍数,perMode为百分比模式
var per;
var maxNum = 0;
var perMode = false;
//自定义Math求最小公约数方法
Math.gcd = function(a, b) {
var min = Math.min(a, b);
var max = Math.max(a, b);
var result = 1;
if (a === 0 || b === 0) {
return max;
}
for (var i = min; i >= 1; i--) {
if (min % i === 0 && max % i === 0) {
result = i;
break;
}
}
return result;
};
//使用clone元素对象拷贝仍然会造成浪费,但是使用权重数组对应关系更省内存
var weight_arr = new Array();
for (i = 0; i < arr.length; i++) {
if ('undefined' != typeof (arr[i].weight)) {
if (arr[i].weight.toString().indexOf('%') !== -1) {
per = Math.floor(arr[i].weight.toString().replace('%', ''));
perMode = true;
} else {
per = Math.floor(arr[i].weight * 100);
}
} else {
per = 0;
}
weight_arr[i] = per;
maxNum = Math.gcd(maxNum, per);
}
//数字比模式,3:5:7,其组成[0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2]
//百分比模式,元素所占百分比为15%,25%,35%
var index = new Array();
var total = 0;
var len = 0;
if (perMode) {
for (i = 0; i < arr.length; i++) {
//len表示存储arr下标的数据块长度,已优化至最小整数形式减小索引数组的长度
len = weight_arr[i];
for (j = 0; j < len; j++) {
//超过100%跳出,后面的舍弃
if (total >= 100) {
break;
}
index.push(i);
total++;
}
}
//使用最后一个元素补齐100%
while (total < 100) {
index.push(arr.length - 1);
total++;
}
} else {
for (i = 0; i < arr.length; i++) {
//len表示存储arr下标的数据块长度,已优化至最小整数形式减小索引数组的长度
len = weight_arr[i] / maxNum;
for (j = 0; j < len; j++) {
index.push(i);
}
total += len;
}
}
//随机数值,其值为0-11的整数,数据块根据权重分块
var rand = Math.floor(Math.random() * total);
//console.log(index);
return arr[index[rand]].advertId;
}
随机结果方法的封装和调用
function randomWeightByAdvertise(data) {
var advertObj = data, show = [];
//获取top==1的结果
for (var i = 0; i < advertObj.length; i++) {
if (advertObj[i].top == 1) {
var randomArr = [];
for (var j = 0; j < advertObj[i].data.length; j++) {
var advertise = {
advertId : advertObj[i].data[j].advertId,
weight : advertObj[i].data[j].weight
};
randomArr.push(advertise);
}
show.push(weight_rand(randomArr));
}
}
//获取top==0的结果
for (var i = 0; i < advertObj.length; i++) {
if (advertObj[i].top == 0) {
var randomArr = [];
for (var j = 0; j < advertObj[i].data.length; j++) {
var advertise = {
advertId : advertObj[i].data[j].advertId,
weight : advertObj[i].data[j].weight
};
randomArr.push(advertise);
}
show.push(weight_rand(randomArr));
}
}
return show;
}
请求接口获取结果
function getRalationTask() {
var newShow = [];
$.getJSON('http://127.0.0.1:8080/hhz-web/article/advertes.html', function(data) {
var str='',str2='';
for (var int = 0; int < data.length; int++) {
str+=data[int].advertId+",";
}
console.log(str);
var advertObj = groupByAdvertisementSort(data);
var advertArr = randomWeightByAdvertise(advertObj);
for (var int = 0; int < advertArr.length; int++) {
str2+=advertArr[int]+",";
}
console.log(str2);
});
}
具体执行代码
$(document).ready(function() {
getRalationTask();
});
具体思路参考大神的博客地址https://www.cnblogs.com/xiaodongli/p/5193356.html