随机选择没有重复项的数组项而不删除项(JavaScript)

我已经看到很多关于随机选择数组项而不重复的问题。 但是,大多数都是通过使用拼接方法来回答的。 但这会删除项目。

我已经随机选择了我的项目,但他们正在重复。 在我的两个函数中,我从每个随机选择的项目中选择两个“子项”。 这两个函数不能一起工作,我正在寻找一种方法,可以选择两个不同的随机选择的项目,而无需重复,也不需要删除它们。 可以帮我一个忙吗?

(使用Adobe Edge Animate)

var xml_source = "series.xml"; var initLoadScript = false; var items = []; var itemTitle1; var obj = new Object(); var previousNumber = -1; loadXML(); function loadXML() { $.ajax({ type: "GET", url: xml_source, dataType: "xml", success: function(xml) { $(xml).find('sbs').find('channel').find('item').each(function() { items.push($(this)); }); itemOne(); itemTwo(); } }); } function itemOne(){ var randomNumber = Math.floor(Math.random()*14); var assignItem = randomNumber; console.log("random nummer 1: " + assignItem); sym.$("TitleText1").html(items[assignItem].find("author_name").text()); sym.$("Image1").html(""); } function itemTwo(){ var randomNumber = Math.floor(Math.random()*14); var assignItem = randomNumber; console.log("random nummer 2: " + assignItem); sym.$("TitleText2").html(items[assignItem].find("author_name").text()); sym.$("Image2").html(""); } 

XML结构示例:

    Feed Video //www.URL.com Fri Fri 1  title aflevering //www.google.com //www.google.com berg Wed   1.0 video provider http://www.video.nl/url 10 10 title1 author name http://www.google.com/   title title descr    

我不太了解你想要达到的目标,但这里有一种方法可以让我获得一次随机物品

 var letters = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N"]; 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); // items, in your case getRandom(); // some letter getRandom(); // some other letter ... getRandom(); // different letters until all are given // if the method is called more times than the array length it'll return undefined 

编辑:由于@JLRishe评论提高了性能

尝试

 var items = [] , res = null , dfd = new $.Deferred() , processItems = function (item) { var index = $.inArray(item, items); console.log("random number: " + index); $("
", { "class": "TitleText", "html": $(item).children().find("author_name")[0].innerHTML, "data-index": index }) .add("
") .add( $("
", { "class": "Image", "data-index": index, "html": $("", { "class": "Image", "data-index": index, "src": $(item).children() .filter("media\\:content") .children("media\\:thumbnail") .attr("url") + "?" + $.now(), "width": "145" }) }) ) .appendTo(".items") } , loadXML = function() { return $.post("/echo/xml/", {xml:xml}, "xml") .then(function(xml) { $(xml.documentElement) .find("item") .each(function(i, el) { items.push(el) }); return items }) }; loadXML() .then(function(data) { $.each(data, function(i, item) { setTimeout(function() { // select different randomly selected items, // without repetition processItems(item); ++res; if (res === data.length) { dfd.resolve(res + " items processed"); } }, 1 + Math.floor(Math.random() * 25)); }); return $.when(dfd, data) }, function(jqxhr, textStatus, errorThrown) { console.log(textStatus, errorThrown) }) .then(function(msg, data) { console.log(msg, data) });

jsfiddle http://jsfiddle.net/guest271314/o5tfs48r/

如果要以随机顺序浏览数组而不修改原始数组:

  1. 使用ary.slice()复制数组(这将复制数组,但如果它们是对象则不复制它的值)。
  2. 随机播放副本。
  3. 迭代副本。
 var items = ["a", "b", "c", "d", "e", "f", "g"]; var copy = getShuffledCopy(items); copy.forEach(function (el) { console.log(el); }); function getShuffledCopy(ary){ var copy = ary.slice(); shuffle(copy); return copy; } function swap(ary, pos1, pos2) { var tmp = ary[pos1]; ary[pos1] = ary[pos2]; ary[pos2] = tmp; } function shuffle(ary){ // Fisher-Yates shuffle for(var i = ary.length - 1; i >= 1; i -= 1) { swap(ary, Math.floor(Math.random() * i), i); } }