2017-09-26 61 views
2

我试图获得一个数组的随机值。经典的系统是这样的:(JS)如何从数组中获得随机值(不是长度,因为键......!)

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的唯一)

;)

+0

那么你是说这是一个稀疏的数组?它有122个差距,然后是索引123,然后更多的差距,直到索引444等? –

+0

实际上他的问题是数组的创建,他创建了12346个元素的数组,所以当他获得随机值时,大多数元素都是未定义的,但他得到了未定义的值。在12346长度的阵列中很难击中他的5个数字中的一个 – pegla

+0

过滤原始数组的有效元素,然后从过滤的元素数组中获得随机值。 – Ammar

回答

1

可以存储未在阵列未定义数组的元素的索引,使用相同的步骤获取索引数组的元素不在括号内ation

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

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

let res = tmpArray[index]; 
+0

该死!这正是我需要的。另一个tmp数组。谢谢 ! – OverSu

+0

更重要的是,你如何获得非稀疏索引的数组? –

+0

@NinaScholz你可以使用'Object.keys()','let indexes = Object.keys(tmpArray)'' – guest271314

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计数)

有一个很好的解决方案,如果你正在创建动态阵列上使用阵推推对象数组,如果你需要的是钥匙,你可以使用:

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

那么你可以很容易地找到你所需要的是这样的:

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

感谢您的回答,这也是工作。但我宁愿不在每一个“发现”。因为我有一个钥匙looooooooot。谢谢 ! :) – OverSu

+0

好吧,如果你在“somekey”下添加你的对象,就像你在例子中看到的那样,它不会进入你的对象,它只检查顶级属性(其中2个),如果name是“number”并且它是相等的到你的电话号码你会得到整个对象,你可以阅读“someKey”,它将持有对象的数据。你应该避免无缘无故地创建大数组。你现在可能没有问题,但最终你会遇到麻烦和性能问题。 – pegla

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; }

映射所有nonsparsed指数

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; }

+0

您的解决方案也可以! ;) – OverSu