在javascript中从数组中选择另一个值

时间:2015-07-23 18:30:41

标签: javascript

给定一组id的JavaScript中最好的方法是什么:

var ids = ['ax6484', 'hx1789', 'qp0532'];

和当前ID hx1789来选择另一个值随机 来自ids数组的电流?

5 个答案:

答案 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))];

Example Here

答案 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