给定一组id的JavaScript中最好的方法是什么:
var ids = ['ax6484', 'hx1789', 'qp0532'];
和当前ID hx1789
来选择另一个值随机 不来自ids数组的电流?
答案 0 :(得分:5)
获取值的索引,生成随机值,如果random是索引,则少用1(取决于随机生成)
var random = Math.floor(Math.random() * ids.length)
var valueIndex = ids.indexOf("hx1789");
if (random === valueIndex) {
if (random === 0) {
random = 1;
} else {
random = random - 1;
}
}
var randomValue = ids[random];
演示:http://jsfiddle.net/sxzayno7/
是的,测试阵列长度,如果它是1 - 可能不想这样做!谢谢@ThomasStringer
if (ids.length > 1) { //do it! }
或者只是过滤掉该值并反对:
var randomIndex = Math.floor(Math.random() * (ids.length - 1))
var random = ids.filter(function(id) {
return id !== "hx1789";
})[randomIndex]
答案 1 :(得分:1)
我可能会做一些事情:
var current = 'hx1789'; // whatever variable stores your current element
var random = Math.floor(Math.random() * ids.length);
if(random === ids.indexOf(current)) {
random = (random + 1) % ids.length;
}
current = ids[random];
基本上,如果新挑选的元素位于同一个索引上,您只需从数组中选择下一个元素,或者如果超出范围,则选择第一个。
答案 2 :(得分:1)
UnderscoreJS是你最好的朋友!
sublime.log_commands(False)
或变量;
_.sample(_.without(['ax6484', 'hx1789', 'qp0532'], 'hx1789'));
答案 3 :(得分:0)
您可以创建一个重复的数组,然后从该数组中删除当前的索引元素,并从删除的项目中选择一个随机元素:
var ids = ['ax6484', 'hx1789', 'qp0532'];
var currentIndex = ids.indexOf('hx1789');
var subA = ids.slice(0);
subA.splice(currentIndex , 1);
var randItem = subA[Math.floor((Math.random() * subA.length))];
答案 4 :(得分:0)
如果您的值不是一个简单的字符串,例如hx1789
,那么这会变得更加棘手,而是例如来自您想要生成不同值的数组中的数组:
let weekSegments = [["Su","Mo"],["Tu","We"],["Th","Fr","Sa"]];
如果你有索引它很简单,无论数组(或对象)的嵌套程度如何和/或它包含的值的类型如何:
let index = 1;
let segment = weekSegments[index];
let randomIndex;
let randomSegment;
if (weekSegments.length >= 1) {
randomIndex = Math.floor(Math.random) * (weekSegments.length - 1);
randomSegment = weekSegments.filter((val, i) => i !== index)[randomIndex];
}
没有索引虽然事情变得更复杂,因为必须在过滤器函数中测试数组和/或对象相等性。在上面的情况下,它相当容易,因为它是一个只有一个深度的数组,而这个数组只包含简单的值。首先,我们创建一个已经存在的已排序段值的字符串表示形式,然后在每个val
迭代中将其与filter
的字符串表示形式进行比较:
let segmentVals = segment.sort().join(',');
if (weekSegments.length > 1) {
randomIndex = Math.floor(Math.random) * (weekSegments.length - 1);
randomSegment = weekSegments.filter((val) => {
return segmentVal !== val.sort().join(',');
})[randomIndex];
}
当处理对象而不是深度嵌套的数组和/或数组/对象和/或包含非嵌套值时,它会转化为对象相等的棘手问题,这可能与此Q& A