B-Teck!

お仕事からゲームまで幅広く

【JavaScript】配列からランダムに値を取り出す

/** 
* randAry
* 配列内からランダムに値を取得する
* @param {array} i_ary 配列
* @return {object} 配列内の値
*/
function randAry(i_ary){
  //添字を全て取得
  var aryKeys = Object.keys(i_ary);
  //対象の添字をランダムに取得
  var index = aryKeys[Math.floor(Math.random() * aryKeys.length)];
  return i_ary[index];
}

/** 
* randAry2
* 配列内からランダムに値を取得する
* 取得した値は元の配列から削除される
* @param {array} i_ary 配列
* @return {object} 配列内の値
*/
function randAry2(i_ary){
    //添字を全て取得
    var aryKeys = Object.keys(i_ary);
    //対象の添字を取得
    var index = aryKeys[Math.floor(Math.random() * aryKeys.length)];
    retVal = i_ary[index];
    //引数が配列か判定する
    if(i_ary instanceof Array){
        ary.splice(index,1);
    }else{
        //配列でなければ連想配列と見做す
        delete i_ary[index];
    }
    return retVal;
}


var ary = [0, 2, 4, 6, 8, 10];
console.log("ary 初期状態:" + ary);
console.log(randAry(ary))

console.log("ary randAry後:" + ary);

console.log(randAry2(ary));
console.log("ary randAry2後:" + ary);
// ary 初期状態:0,2,4,6,8,10
// 8
// ary randAry後:0,2,4,6,8,10
// 8
// ary randAry2後:0,2,4,6,10

var hogeArr = { test1 : "田中" , test2 : "佐藤" , test3 : "山本" , test4 : "鈴木" } ;
console.log(hogeArr)
console.log(randAry(hogeArr))

console.log(hogeArr)

console.log(randAry2(hogeArr))
console.log(hogeArr)
// { test1: '田中', test2: '佐藤', test3: '山本', test4: '鈴木' }
// 佐藤
// { test1: '田中', test2: '佐藤', test3: '山本', test4: '鈴木' }
// 佐藤
// { test1: '田中', test3: '山本', test4: '鈴木' }

参考

JavaScriptの配列の要素を削除する(delete演算子とspliceメソッド) – 山本隆の開発日誌

JavaScript で配列を判定する正しいやり方 - Qiita