从数组/ Javascript中删除随机元素

时间:2017-08-04 11:21:26

标签: javascript arrays function

我搜索了我的问题但未找到答案,请提前感谢您的帮助。问题是,我有一些工作正常的代码,但我想改进它:

function go(times) {
    function pick(n) {
        return n[Math.floor(Math.random() * n.length)];
    }

    var body = ["face", "nose", "hair", "smile"];
    var adj = ["amazing", "nice", "beautiful", "perfect"];
    var word = ["great", "innocent", "glowing", "adorable"];

    var str = "Your " + pick(body) + " looks " + pick(adj) + " and " + pick(word) + "!";
    if (times > 0) {
        for (i = 0; i < times; i++) {
            str = str + " And " + go().toLowerCase();
        }
    }

    return str;
}

当挑选随机字时,应该从数组中删除它,这样就不会有任何重复。如果我知道元素的确切索引,我可以使用splice函数处理它,但是当它是随机的时,它不能按照我想要的方式工作。

5 个答案:

答案 0 :(得分:1)

您可以轻松地向所有阵列添加一个函数,以返回随机值和/或随机删除一个。

// After this, you can call.getRandomValue() on any array!
Array.prototype.getRandomValue = function(removeItem) {
    if (this.length < 1) throw "Cannot get random value from zero-length array";
    var randomIndex = Math.floor(Math.random() * this.length);
    var randomValue = this[randomIndex];
    if (removeItem)
        this.splice(randomIndex, 1);
    return randomValue;
};

function constructDescription(sentenceCount) {
    var body = ["face", "nose", "hair", "smile"];
    var adj = ["amazing", "nice", "beautiful", "perfect"];
    var word = ["great", "innocent", "glowing", "adorable"];    

    var description = "";

    for(var i = 0; i < sentenceCount; i++) {
      if (body.length > 0 && adj.length > 0 && word.length > 0) {
        description += (description.length > 0) ? " And your " : "Your ";
        description += body.getRandomValue(true) + " looks " + adj.getRandomValue(true) + " and " + word.getRandomValue(true) + "!"         
      }    
    }

    return description;
}

<强> Try it out with a Fiddle here.

答案 1 :(得分:0)

您只需要将拼接和随机发生器组合在一起。例如:

function go(times) {

    var body = ["face", "nose", "hair", "smile"];
    var adj = ["amazing", "nice", "beautiful", "perfect"];
    var word = ["great", "innocent", "glowing", "adorable"];

    function pick(n) {
        return n.splice(Math.floor(Math.random() * n.length), 1);
    }

    var str = "";

    for (var i = 0; i < times; i++) {
        str += (i > 0 ? " And your ":"Your ") + pick(body) + " looks " + pick(adj) + " and " + pick(word) + "!";
    }

    return str;
}

答案 2 :(得分:0)

使用不同的函数,而不是在循环中递归调用go()。通过为每个短语调用go(),您每次都会初始化原始数组。然后在pick()

中进行拼接

&#13;
&#13;
function go(times) {
  var body = ["face", "nose", "hair", "smile"];
  var adj = ["amazing", "nice", "beautiful", "perfect"];
  var word = ["great", "innocent", "glowing", "adorable"];
  var str = ''

  function pick(n) {
    var idx = Math.floor(Math.random() * n.length);
    var str = n[idx];
    n.splice(idx, 1)
    return str;
  }

  function getPhrase(i) {
    var phrase =  pick(body) + " looks " + pick(adj) + " and " + pick(word) + "!";
    return i == 0 ? "Your " + phrase : " And your " + phrase;
  }

  for (var i = 0; i < times; i++) {
    str += getPhrase(i);
  }


  return str;
}

document.body.innerHTML = go(4);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

@lucounu解决方案绝对是现货。

如果您只想改进初始解决方案,可以执行以下操作:

    var body = ["face", "nose", "hair", "smile"];
    var adj = ["amazing", "nice", "beautiful", "perfect"];
    var word = ["great", "innocent", "glowing", "adorable"];

    function go(times) {

    function pick(n) {
        var index =  Math.floor(Math.random() * n.length)
        var randomString  = n[index];
        n.splice(index,1);
        return randomString;
    }

    var str = "Your " + pick(body) + " looks " + pick(adj) + " and " + pick(word) + "!";

    if (times > 0) {
        for (i = 0; i < times; i++) {
            str = str + " And " + go().toLowerCase();
        }
    }

    return str;
}

console.log(go(2));

答案 4 :(得分:-2)

试一试

var data = ["brain", "mitochondria", "microsope", "beaker", "beaker-2", "scientist", "cell", "atom"];

    while (data.length) {
        document.write(data.splice(data.length * Math.random() | 0, 1)[0] + '<br>');
    }