带删除项的随机选择数组(jQuery)

时间:2016-02-24 20:56:25

标签: javascript arrays function random

我试图找到一种方法从随机方式的数组中获取值而不重复它们,我找到了以下解决方案:

var letters = ["A", "B", "C"];
var getRandom = (function(array) {
  var notGivenItems = array.map(function(el) {
    return el;
  });
  var getIndex = function() {
    return Math.floor(Math.random() * notGivenItems.length);
  };

  return function() {
    if (notGivenItems.length === 0) {
      return;
    }

    return notGivenItems.splice(getIndex(), 1)[0];
  };
})(letters);

console.log(getRandom());
console.log(getRandom());
console.log(getRandom());
console.log(getRandom());

如果我打印console.log() 4次,最后,数组显示为undefined,这正是我需要的。但是,我需要(function () {...不要自动触发,因为来自AJAX的值。所以,应该是这样的:

function selec() {

  var getRandom = (function(array) {
    var notGivenItems = array.map(function(el) {
      return el;
    });
    var getIndex = function() {
      return Math.floor(Math.random() * notGivenItems.length);
    };

    return function() {
      if (notGivenItems.length === 0) {
        return;
      }

      return notGivenItems.splice(getIndex(), 1)[0];
    };
  })(letters);

  return getRandom();
}

console.log(selec());

然后,该函数继续连续打印值,而不返回undefined

2 个答案:

答案 0 :(得分:0)

每当您致电selec()时,它都会重新创建getRandom功能。

您需要做的是在getRandom函数范围之外定义selec()

您可以在同一级别执行此操作:

var getRandom = (function(array) { ... })(letters);
var selec = function() { return getRandom; };

您可以创建一个闭包来保护getRandom不受命名冲突的影响:

var selec = (function() {
    var getRandom = (function(array) { ... })(letters);
    return function() { return getRandom; };
})();

答案 1 :(得分:0)

我希望我理解你的问题..如果是的话,真的很容易。选中 fiddle



var letters = ["A", "B", "C"];

function getRandom(array){
  var notGivenItems = array.map(function(el){
    return el;
  });
  var getIndex=function(){
    return Math.floor(Math.random() * notGivenItems.length)
  };
  if (notGivenItems.length === 0)
    return;
  return array.splice(getIndex(), 1)[0];
}

console.log(getRandom(letters));
console.log(getRandom(letters));
console.log(getRandom(letters));
console.log(getRandom(letters));