Javascript 在列表中使用随机生成的nr至少两次
我有以下几把小提琴: 它包含一个javascript生成的列表。每个Javascript 在列表中使用随机生成的nr至少两次,javascript,jquery,random,html-lists,Javascript,Jquery,Random,Html Lists,我有以下几把小提琴: 它包含一个javascript生成的列表。每个都有一个随机选择的类。此随机选择通过以下方式完成: 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是a2,则类将是b 这
都有一个随机选择的类。此随机选择通过以下方式完成:
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是a2
,则类将是b
这是一个完美的例子。我的问题是,我希望每个类(或随机nr)在到达完整列表的末尾之前至少使用两次。(小提琴有一个很短的列表,真正的列表更长,还包含多个
)
示例:因此,如果随机选择的nr为5
,它将给出classe
。这意味着必须再次使用此nr/类别,但也必须随机放置在所有不同的列表上。如果列表中的随机nr恰好是5
,则可以多次使用nr/类
整个列表中使用的
总量始终为偶数
另一个例子:
因此,超过6个
的类可以是:a、d、a、e、e、d
。所有的班级都有两次,而且都是随机的
这是错误的:a、d、b、b、e、c
。这是当前的情况,这些类不会被使用两次
希望我把问题解释得足够清楚。我的英语不是最好的:)
亲切问候,编辑-取代了以前的解决方案,因为它没有在所有
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;
};
假设是:
//现在将声明移动到外部范围并稳步增加计数。
itemCount+=1
现在,代码正在按照我的计划执行所有操作
-使用70个链接和11个类池
所有链接都得到get类,所有类至少使用了两次,因为我们只有11个。
任何链接都不应该没有类,因为总有一个源可供选择
关于你关于确保每节课至少使用一节课的问题。这取决于可用类与总项的中间标记的比率
如果您使用11个类作为可能的源和至少22个预期链接,那么您的所有类都将被使用,将被使用两次
如果您正在使用20个类和22个项目,则否不会使用所有类。这样做的原因是因为您最初要求每个选定的类至少使用两次
为了确保所有选定的类至少使用两次,我将在名为selectedClasses
的单独数组中记录每个选择。我们已经处理了一半的可能项,我用selected classes数组替换源类。现在,项目的另一半只能从已经选择的类列表中进行选择,从而确保每个类至少使用两次
试想一下,如果您有一个包含20个类和总共22个项的数组,那么您不能使用所有类,如果您同时希望确保所选的每个类至少使用两次,则至少不能使用一个类。这些要求相互矛盾
可用类的数量必须小于或等于项目总数的一半,以确保所有类至少使用一个和所有选定类至少使用两次
我希望这是有意义的,但如果您被卡住了,请随时在评论区内开始聊天,我可以再次与您讨论代码,没有问题。编辑-替换了以前的解决方案,因为它不会在所有
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;
};
假设是:
//现在将声明移动到外部范围并稳步增加计数。
itemCount+=1
现在,代码正在按照我的计划执行所有操作
-使用70个链接和11个类池
所有链接都得到get类,所有类至少使用了两次,因为我们只有11个。
任何链接都不应该没有类,因为总有一个源可供选择
关于你关于确保每节课至少使用一节课的问题。这取决于可用类与总项的中间标记的比率
如果您使用11个类作为可能的源和至少22个预期链接,那么您的所有类都将被使用,将被使用两次
如果您正在使用20个类和22个项目,则否不会使用所有类。原因