在Javascript中从数组的数组中随机选择一个数组

6

我有一个数组的数组。

var ArrOfarr = { A1: ["choice", "choice2", "choice3"], A2: ["choice1", "choice2"], A3: ["choice1", "choice2"], A4: [], A5: [], A6: [], A7: [] }

我想每次点击按钮时从“ArrOfarr”中随机选择一个数组。我尝试了下面的代码,但是出现了“undefined”的情况:
function A()
{
var item = ArrOfarr[Math.floor(Math.random()*ArrOfarr.length)];
alert(item);
}

如何从上述数组中随机选择一个数组(不重复,直到达到其长度)。如何获取随机选择的数组的名称?

1
这不是一个数组的数组,而是一个数组的对象。在这里看一下 - https://dev59.com/eXE85IYBdhLWcg3w8IbK - Mark Walters
4个回答

5

您那里没有一个数组,而是一个包含数组的对象。要选择一个随机条目,您可以使用以下代码:

function A(){
  var keys = Object.keys( ArrOfarr );

  var name = keys[ Math.floor(Math.random()*keys.length) ];

  var item = ArrOfarr[ name ];

  alert( name );
  alert( item );
}

另一种选择是在首次更改数据结构:不要使用数组作为内部对象,而是可以使用包含dataname的包装对象。

var ArrOfarr = [  {name: 'A1', data: ["choice", "choice2", "choice3"] }, /* ... */ ];

function A() {
  var item = ArrOfarr[Math.floor(Math.random()*ArrOfarr.length)];
  alert(item.data);
}

你的意思是 var ArrOfarr = [{name: A1, data: ["choice", "choice2", "choice3"] }, /* ... */}]; 吗? - M.K
@M.K 你是什么意思? - Sirko
以上任何一种解决方案都对您有用吗?我尝试了两种,但没有看到警报。 - M.K
@M.K 抱歉 - 已经修复了一些错别字和错误。现在应该可以正常工作了。 - Sirko
谢谢Sriko,现在可以工作了。但是随机选择的结果是A3、A5、A3、A7...如何防止在完成挑选所有不同数组之前不再挑选已经挑选过的数组。 - M.K
@M.K 有一个“工作”数组:将其初始化为所有项目,然后删除已选择的条目,直到它为空。然后重新初始化并继续进行。 - Sirko

1
var ArrOfarr = { A1: ["choice", "choice2", "choice3"], A2: ["choice1", "choice2"], A3: ["choice1", "choice2"], A4: [], A5: [], A6: [], A7: [] }

是一个对象字面量

var ArrOfarr = [["choice", "choice2", "choice3"], ["choice1", "choice2"], ["choice1", "choice2"], [],  [], [],  []]

数组的数组;

要么更改您的代码并使用数组定义,要么使用Sirko的代码。


1
你只需要在随机选择的索引前面加上'A'即可:
function A(){
    var item = ArrOfarr['A'+(Math.floor(Math.random() * ArrOfarr.keys().length)+1)];
    alert(item);
}

另外,请注意+1:这是因为您的对象从A1开始计数,而您的random函数返回从0开始的值。
最后一个更改是在您的random函数中添加了.keys()。因为ArrOfarr是一个对象,它没有length属性。然而,.keys()返回它的键的数组,该数组具有length属性。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接