随机选择没有重复项的数组项,而不删除项(JavaScript)
Random select array item without duplicates without removing items (JavaScript)
我见过许多关于随机选择数组项而不重复的问题。然而,它们中的大多数都是通过使用拼接方法来回答的。但这会删除项目。
我已经随机选择了我的项目,但它们正在重复。在我的两个功能中,我从每个随机选择的项目中选择两个"子项目"。这两个功能不能一起工作,我正在寻找一种方法,可以选择两个不同的随机选择的项目,而不会重复,也不会删除它们。有人能帮我吗?
(使用Adobe Edge动画)
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 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);
$("<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)
});
jsfiddlehttp://jsfiddle.net/guest271314/o5tfs48r/
如果您想在不修改原始数组的情况下按随机顺序遍历数组:
- 使用
ary.slice()
复制数组(这将复制数组,但不会复制其值(如果它们是对象) - 无序播放副本
- 遍历副本
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);
}
}
相关文章:
- 删除javascript中的大Blob
- 删除javascript中包含特定单词的行
- 可以clearTimeout删除JavaScript中已触发超时事件的未处理回调
- 如何删除javascript中的不透明度
- 如何筛选要写入新文档的HTML,删除JavaScript中的某些类和/或ID
- 如何删除JavaScript画布呈现上下文的状态堆栈
- 将数组中的重复项转换为唯一项,而不删除Javascript中的任何项
- 从 DOM 中删除/删除 Javascript 用户定义的数组
- 如何删除 JavaScript 对象中具有相同键的所有元素
- 使用替换函数删除 Javascript 中元素的类
- 使用 MVC 删除 JavaScript 中硬编码字符串 Asp.Net 最佳方法
- 如何删除 javascript 中某些字符之前的所有逗号
- 删除 JavaScript 中的全角和半角字符
- 滑动以删除JavaScript
- 只删除javascript中的1个动态元素
- 如何删除Javascript对象属性
- 如何删除javascript数组中的空白元素
- 删除Javascript中小数后的数字
- 删除javascript中的decimal
- 从ASP.NET MVC部分视图中卸载/删除javascript函数