在列表中至少使用两次随机生成的nr
Use a random generated nr in a list at least twice
我有以下小提琴:http://jsfiddle.net/mauricederegt/MhhBc/
它包含一个带有javascript生成列表的。每个CCD_ 1被赋予一个随机选择的类。此随机选择使用:
var randomClass;
randomClass = Math.round(Math.random() * 10 + 0);
这会产生一个随机的nr。这个nr我用来获得这里定义的随机类:
var classes = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'];
因此,如果随机nr是2
,则类将是b
这个al工作得很好。我遇到的问题是,我希望每个类(或随机nr)在到达完整列表的末尾之前至少使用两次。(fiddle有一个很短的列表,真正的列表更长,也包含多个<ul>
)。
示例:因此,如果随机选择的nr是5
,它将给出类e
。这意味着这个nr/类必须再次使用,但也必须随机放置在所有不同的列表上。如果随机nr恰好在列表中稍后再次为5
,则可以多次使用nr/类。
整个列表中使用的<a>
的总量始终是偶数。
另一个例子:所以6个<a>
的类可以是:<a>
0。所有的类都在里面两次,而且都是随机的。
这是错误的:a, d, b, b, e, c
。这是目前的情况,类没有使用两次
希望我把问题解释得足够清楚。我的英语不是最好的:)
亲切问候,
编辑-替换了以前的解决方案,因为它没有在所有ul
标签中重复
我已经更新了您的代码,现在它总是在所有<ul>
标记中至少添加两次每个类。
我确实需要事先列出项目的总数。目前,我已经将该计数添加为常量totalCount
,因为我不想为了获得总计数而对JSON对象进行两次迭代,而且我想首先让主代码工作。
也许总计数可以作为JSON对象的一部分作为对象根中的一个单独属性发送?
无论哪种方式,物品的总数都必须以某种方式提前知道。
我将一些必需的变量移到了一个更全局的范围,因为每个ul
都会调用render方法。
var classes = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'];
//var classes = ['a', 'd', 'f'];
var sourceClasses = [];
var totalCount = 6;
var selectedClasses = [];
Menu.prototype.render = function() {
// Get total item count between all arrays
//debugger;
var ul = $("<ul />");
$.each(this.data, function(i, e) {
var li = $("<li />");
//console.log(listItemCount);
//debugger;
$.each(e, function(j, f) {
//debugger;
// If we have no more classes left we re-set the list of items to the original source
// SourceClasses.length will off course not be 0 ever if we already passed the half-way mark.
if(sourceClasses.length === 0){
for(index = 0; index < classes.length; index++){
sourceClasses.push(classes[index]);
}
}
var randomClass;
randomClass = Math.round(Math.random() * (sourceClasses.length - 1) + 0);
var selectedClass = sourceClasses[randomClass];
li.append($("<a></a>", {
href: f.url,
text: f.title,
class: selectedClass
}));
sourceClasses.splice(sourceClasses.indexOf(selectedClass), 1);
selectedClasses.push(selectedClass);
// Check for half-way mark.
var itemCount = selectedClasses.length;
if (totalCount % 2 != 0) {
if (itemCount === (totalCount - 1) / 2) {
sourceClasses = selectedClasses;
var additionalClass = Math.round(Math.random() * (sourceClasses.length - 1) + 0);
sourceClasses.push(sourceClasses[additionalClass]);
selectedClasses = [];
};
} else {
if (itemCount === totalCount / 2) {
sourceClasses = selectedClasses;
selectedClasses = [];
};
}
});
ul.append(li);
});
//console.log($($(ul).find("a")));
return ul;
};
DEMO-每个类在所有列表项中至少使用两次
(使用浏览器中的调试器工具检查渲染的HTML以获取结果)
您注意到,现在内部循环中发生的第一件事是,我正在检查是否还有可用的类,如果没有,我会将可用的类重新设置到原始列表中。
只有当可用类的原始列表少于项目总数时,才会发生这种情况。
在每个列表项的迭代过程中,我仍然从可用类的列表中删除选定的类,以确保每个类至少显示两次。
我仍然在另一个数组中记录所选的类,然后在项目列表进行到一半时,我用它来重新设置可用类的数组。
如果项目总数为奇数或偶数,则该代码有效。
对于偶数的总项目,我们只需通过除以2来测量laf方式标记。
对于奇数个总项目,我确保标记中途(totalCount -1) / 2
,然后在已经选择的类中添加一个随机类作为额外的可用类。
这一切现在都应该如预期的那样工作。。。。。
编辑(2021年9月3日)
我检查了代码,发现其中有一个逻辑错误。itemCount
在中途标记后被重新设置。
此代码:
var itemCount = selectedClasses.length;
假设已经://将声明移到外部范围,并稳步增加计数。itemCount+=1
现在代码正在按我的计划做每件事。
DEMO-使用70个链接和11个类池
所有链接都得到了get类,所有类都至少使用了两次,因为我们只有11个。任何链接都不应该最终没有类,因为总是有一个源可供选择。
关于你的问题,确保每节课至少使用一节。这取决于可用类别与总项目的中间分数的比例。
如果您使用11个类作为可能的源和至少22个预期链接,则所有类都将被使用,将被使用两次。
如果您使用20个类和22个项目,则否并非所有类都将被使用。原因是您最初的要求to use each selected class at least twice
。
为了确保所有选择的类至少使用两次,我将在一个名为selectedClasses
的单独数组中记录每个选择。我们已经处理了一半可能的项目,我用选定的类数组替换源类。现在,项目的另一半只能从已经选择的类的列表中进行选择,从而确保每个类至少使用两次。
想想看,如果你有一个由20个类和总共22个项目组成的数组,你就不能使用所有的类——如果你同时想确保每个被选中的类至少使用两次,那么至少要使用一个。这些要求相互矛盾。
可用类的数量必须小于或等于项目总数的一半,以确保所有类至少使用一个和所有选定类至少使用两次。
我希望这是有道理的,但如果你被卡住了,请随时在评论区开始聊天,我可以再次与你讨论代码,没问题。
- Meteor Router数据函数被调用两次
- 从MySQL数据库中获取输入数据需要两次页面刷新
- Module.start()已激发两次
- Jquery点击事件必须点击两次
- Append元素在运行两次函数后不显示
- 防止双击执行两次jQuery post请求
- 我必须点击两次才能激活任何按钮操作(离子/角度)
- 单击jQuery会激发两次
- 如何避免在树上走两次
- button.单击两次删除附加操作后不工作
- 由于$compile,Javascript(Angular)嵌套指令加载了两次
- 在列表中至少使用两次随机生成的nr
- 仅随机获取同一图像两次
- 调用随机函数Javascript,但不能两次调用相同的函数
- Vtiger-Jquery滑动切换随机切换两次
- 随机更改网页而不会两次获得同一页面
- 如何穿't在这个随机背景js中连续两次具有相同的bg
- 主干app中的所有事件触发两次.随机发生
- 我怎么能确保每2个随机的颜色被使用两次
- JS:没有重复相同字符串两次的随机字符串