从关联数组中选取一个随机数组元素

时间:2011-12-08 02:59:47

标签: javascript

如何从关联数组中选择关于数组长度的随机数组元素?

例如:

actors[name]=firstname
movielist[title]=[director,artwork,actors]

如果我想从中取出一个随机数组元素及其所有信息,那我该如何实现呢?

1 个答案:

答案 0 :(得分:1)

假设“关联数组”是指一个JavaScript对象(具有零个或多个键/值属性),您可以执行以下操作,它会随机选择一个属性并返回其名称:

function getRandomObjectPropertyName(obj) {
   var a = [],
       k;

   for (k in obj)
      if (obj.hasOwnProperty(k)
         a.push(k);

   if (a.length === 0)
      return null; // or whatever default return you want for an empty object

   return a[Math.floor(Math.random() * a.length)];

   // or to return the actual value associated with the key:
   return obj[ a[Math.floor(Math.random() * a.length)] ];
}

如果不清楚上述内容是如何工作的,它会将对象中的所有键名复制到一个数组中。 .hasOwnProperty()的使用(可以说)是可选的,具体取决于您的需求。由于数组具有长度和数字索引项,因此您可以使用Math函数随机选择项。

获得随机选择的密钥名称后,您可以使用它来访问该属性的值。或者(如上所示)您可以更改函数以返回实际值。或者(未显示,但是微不足道)更改函数以将键和值都作为新对象返回。由你决定。

从您的问题来看,您的数据结构是什么有点不清楚,但假设movielist是一个对象,其中每个属性都有一个键名称,即电影标题和一个关联属性,它是一个包含导演,艺术品的数组和一个嵌套的演员阵列,然后你可以这样做:

var randomMovieTitle = getRandomObjectPropertyName(movielist);
// randomMovieTitle might be, say, "Back to the future"

// you could then get the list of actors associated with the movie like so:
var actorsFromRandomMovie = movielist[randomMovieTitle][2];

// or get the director:
alert(movielist[randomMovieTitle][0]); // "Robert Zemeckis"

编辑:如果您不关心旧浏览器,可以使用Object.keys()获取所有关键名称的数组,然后从中随机选择。