我正在使用JavaScript构建歌曲播放列表。我已经使用了一个关联数组
foo
--我的对象结构看起来类似于:foo[songID] = songURL;
我正在尝试添加洗牌功能。我想从这个列表中随机选择一首歌曲。有没有简单的方法可以做到这一点 - 数组没有索引。
foo
--我的对象结构看起来类似于:foo[songID] = songURL;
我正在尝试添加洗牌功能。我想从这个列表中随机选择一首歌曲。有没有简单的方法可以做到这一点 - 数组没有索引。
Object.keys(object)
来获取对象的键数组。这个函数的非常好的文档可以在 MDN 找到。var randomProperty = function (object) {
var keys = Object.keys(object);
return object[keys[Math.floor(keys.length * Math.random())]];
};
但是你在问题正文中也问到了如何洗牌数组。为此,你需要一个某种类型的洗牌函数(最可能是Fisher-Yates算法的实现),然后直接使用该函数。
var objectKeysShuffled = function (object) {
return shuffle(Object.keys(object));
};
以下是我创建的函数,用于从音频元素的哈希中随机播放背景音乐。
this.bgm = {} //I later added audio elements to this
this.playRandomBGM = function()
{
var keys = Object.keys(this.bgm);
self.currentBGM = keys[Math.floor(keys.length * Math.random())];
console.log("Playing random BGM: " + self.currentBGM);
self.bgm[self.currentBGM].play();
}
self.currentBGM =
替换了return
,即使在所提出的问题中没有self
或currentBGM
。 - Havvyvar obj = {
'song1': 'http://...1',
'song2': 'http://...2',
'song3': 'http://...3',
'song4': 'http://...4',
'song5': 'http://...5',
'song6': 'http://...6',
}, tempArr = [], len, rand, song;
for ( var key in obj )
if ( obj.hasOwnProperty(key) )
tempArr.push( obj[key] );
len = tempArr.length;
rand = Math.floor( Math.random() * len );
song = tempArr[rand];
document.write(song);
var songs = [
{title: 'Song1', url: 'http://...1.mp3'},
{title: 'Song2', url: 'http://...2.mp3'},
{title: 'Song3', url: 'http://...3.mp3'}
];
function fetchRandom(arr) {
var ret,
i = 0;
for (var key in arr){
if (Math.random() < 1/++i){
ret = key;
}
}
return ret;
}
var randomSong = foo[fetchRandom(foo)];
N
个元素的概率将是(N/length)*Product([1, N), N/Length)
,而不是N/Length。 - Havvy一种低效的方法是:
function randomProperty(obj) {
var a = [];
for (var p in obj) {
if (obj.hasOwnProperty(p)) {
a.push(p);
}
}
return a.length? obj[ a[a.length * Math.random() | 0]] : void 0;
}
正如其他人所说,更有效的方法是存储属性名称数组并重复使用它,而不是每次都创建它。