随机 select 数组项,不重复,不删除项 (JavaScript)

Random select array item without duplicates without removing items (JavaScript)

我见过很多关于随机 selecting 数组项而不重复的问题。但是,其中大多数是通过使用拼接方法来回答的。但这会删除项目。

我已经 select 随机编辑了我的物品,但它们在重复。在我的两个函数中,我 select 从每个随机 selected 项目二 "sub-items"。这两个功能不能一起工作,我正在寻找一种方法,可以 select 两个不同的随机 selected 项目,没有重复,也没有删除它们。有人能帮帮我吗?

(使用 Adob​​e 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("<img src='"+items[assignItem].find('media\:content, content').find('media\:thumbnail, thumbnail').attr('url')+"' width='145'/>");
}

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("<img src='"+items[assignItem].find('media\:content, content').find('media\:thumbnail, thumbnail').attr('url')+"' width='145'/>"); 
}

XML 结构示例:

<?xml version="1.0" encoding="UTF-8" ?>
<sbs version="1.0" xmlns:media="http://search.yahoo.com/mrss/">
 <channel>
  <title>Feed</title>
  <description>Video</description>
  <link>//www.URL.com</link>
  <lastBuildDate>Fri</lastBuildDate>
  <pubDate>Fri</pubDate>
  <ttl>1</ttl>
  
     
  <item>
   <title>title</title>
   <description>aflevering</description>
   <link>//www.google.com</link>
   <guid>//www.google.com</guid>
   <formatname>berg</formatname>
   <pubDate>Wed</pubDate>

    <!-- oEmbed -->
   <oembed>
    <version>1.0</version>
    <type>video</type>
    <provider_name>provider</provider_name>
    <provider_url>http://www.video.nl/url</provider_url>
    <width>10</width>
    <height>10</height>
    <title>title1</title>
    <author_name>author name</author_name>
    <author_url>http://www.google.com/</author_url>
   </oembed>

    <media:content
      url="http://google.com"
      type="text/html"
      medium="document"
      expression="full"
      height="10"
      width="10"
      lang="us">
      <media:title type="plain">title</media:title>
      <media:description type="plain">title descr</media:description>
      <media:thumbnail url="http://google.com/tiger.jpg" width="10" height="10" />
     </media:content>

  </item>

尝试

var items = []
, res = null
, dfd = new $.Deferred()    
, processItems = function (item) {
    var index = $.inArray(item, items);
    console.log("random number: " + index);
    $("<div />", {
        "class": "TitleText",
        "html": $(item).children().find("author_name")[0].innerHTML,
        "data-index": index
    })
    .add("<br />")
    .add(
        $("<div />", {
            "class": "Image",
            "data-index": index,
            "html": $("<img />", {
                "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/

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

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 评论

提高了性能

如果您想以随机顺序遍历数组而不修改原始数组:

  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);
    }
}