(JS)如何从数组中获取随机值(不是长度,因为键......!)

时间:2017-09-26 21:16:00

标签: javascript jquery

我正在尝试获取数组的随机值。经典系统是这样的:

tmpArray[Math.floor(Math.random()*tmpArray.length)];

但我的阵列不是这样的:

Array[0, 1, 2, 3, 4]; //length 5

但是这样!

Array[123, 444, 1234, 10000, 12345]; //length 12346

我想从中获取一个随机值,但是随机存在一个值。

有什么想法吗? (仅限纯JS或jQuery)

3 个答案:

答案 0 :(得分:1)

使用稀疏数组,您可以过滤现有项目,然后从中获取随机值。

var array = [1, , , , 2, , , , , , 3, , , , , , , 4, , , , 5, , , , , 6, , , , , , 7],
    temp = array.filter(_ => true);

console.log(temp);
console.log(temp[Math.floor(Math.random() * temp.length)]);
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

映射所有未经过分析的索引

var array = [1, , , , 2, , , , , , 3, , , , , , , 4, , , , 5, , , , , 6, , , , , , 7],
    indices = array
        .map((_, i) => i)   // map indices, got sparse array
        .filter(_ => true); // filter sparse items

console.log(indices);
console.log(array[indices[Math.floor(Math.random() * indices.length)]]);
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

您可以在数组中存储未定义的数组元素的索引,使用相同的过程来获取索引数组的元素以括号表示法设置

let indexes = [123, 444, 1234, 10000, 12345];

let index = indexes[Math.floor(Math.random() * indexes.length)];

let res = tmpArray[index];

答案 2 :(得分:0)

试试这个:

var tmpArray = new Array(123, 444, 1234, 10000, 12345);

之后,这将有效:

tmpArray[Math.floor(Math.random()*tmpArray.length)];

为了更好地解释这里发生的事情,你可能将变量设置为键123上的数组,这实际上是数组中的第123位:

tmpArray[123] = {somekey: 'someval'};

然后tmpArray.length将为124(计数为0)

如果您正在创建数组动态使用push on array将对象推送到数组,如果您需要可以使用的密钥,那么有一个很好的解决方案:

tmpArray.push({number: 123, somekey: 'someval'})
tmpArray.push({number: 1234, somekey: 'someval2'})

然后你可以很容易地找到你需要的东西:

tmpArray.find(x=>x.number===123) //this will fetch wanted object