Javascript 如何从起始索引高于“array.length”的数组中选择N个项?
如果我有一个n个广告的数组,其中有类“ad”。例如当n=5时:Javascript 如何从起始索引高于“array.length”的数组中选择N个项?,javascript,jquery,arrays,sorting,Javascript,Jquery,Arrays,Sorting,如果我有一个n个广告的数组,其中有类“ad”。例如当n=5时: <div class="ad hide">...</div> <div class="ad hide">...</div> <div class="ad hide">...</div> <div class="ad hide">...</div> <div class="ad hide">...</div> 如果
<div class="ad hide">...</div>
<div class="ad hide">...</div>
<div class="ad hide">...</div>
<div class="ad hide">...</div>
<div class="ad hide">...</div>
如果i=1:
注意:随机排列广告不是一个解决方案,这是一个商业原因。它们必须按顺序显示
如何创建选择上述三个项目的选择器
这并没有实现我想要的,但表明了我的意思-例如:
var adIndex = 8;
adIndex = adIndex / $('.ad').length;
$('.ad').slice(adIndex, adIndex+3).removeClass('hide');
非常感谢您的帮助:您可以使用
N % length
旋转索引
8 % 5 = 3
然后从该索引中选择3项,因为它是旋转的,所以您可以创建这样的数组来选择它应该显示的索引
var arr = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4];
// for N
// var arr = Array.from({ length: $('.ad').length }, (n, i) => i);
// arr = arr.concat(arr);
知道应该显示的索引,过滤元素并显示它们
$('.ad').filter(i => indexes.indexOf(i) !== -1);
我是根据我的时间来计算指数的
完整示例:
var时间=2;
var adsToDisplay=3;
var adIndex=时间*adsToDisplay%$'.ad'.length;
var arr=Array.from{length:$'.ad'.length},n,i=>i;
arr=arr.concatarr;
var指数=arr.adIndex,adIndex+3;
var showAds=$'.ad'.filteri=>index.indexOfi!==-1.
var hideAds=$'.ad'.filteri=>index.indexOfi===-1;
移除类“隐藏”;
hideAds.addClass'hide';
.hide{显示:无}
0
1.
2.
3.
4
尝试这个解决方案,因为它将把你的$'.ad '看成一个无限循环,正如你所提到的:
变量ads=$'.ad'; var len=ads.length; var-adIndex=8; 如果adIndex>len{ adIndex=adIndex%len; } 对于var i=adIndex;i5如果我理解正确,并且我仍然认为示例与文本相矛盾,那么在没有JQuery和HTML的情况下,问题的核心解决方案是:
function getPositions(i, arr) {
for (pos = 0; pos < 3; pos++) {
var item = (pos+i) < arr.length ? arr[pos+i] : arr[pos+i-arr.length];
console.log(item);
}
}
显示的i=0的情况有意义…其他情况则没有。要么需要更好地解释过滤规则,要么修复question@akinjide这个问题就像案例所显示的一样模糊,并且缺乏适当的解释,为什么它们会是你们展示它们的方式。你确定这就是你期望的结果吗?你需要澄清当i为0、1或2时该做什么的逻辑。这没有任何意义。当isi=0时,显示前三个广告,当i=1时,显示下三个广告,但没有6,所以从1开始。etc@RhecilCodes好的…似乎缺少的是3个组,其中我定义了组而不是开始索引。除非通过编程创建匹配数组,否则这是不可伸缩的。OP说他们有n个未知数量的项使用eq,而不是创建每次迭代都需要dom搜索的新对象var$ads=$'.ad'//循环前缓存一次。。。。然后在循环$ads.eqi.removeClass中…@charlietfl感谢您的完美评论,答案经过编辑以反映这一点。更简洁、更全面effiicent@charlietfl的确:
var arr = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4];
// for N
// var arr = Array.from({ length: $('.ad').length }, (n, i) => i);
// arr = arr.concat(arr);
$('.ad').filter(i => indexes.indexOf(i) !== -1);
var time = 2;
var adIndex = (time * 3) % $('.ad').length;
function getPositions(i, arr) {
for (pos = 0; pos < 3; pos++) {
var item = (pos+i) < arr.length ? arr[pos+i] : arr[pos+i-arr.length];
console.log(item);
}
}
function getPositions(i, arr) {
i = i*3 % arr.length;
for (pos = 0; pos < 3; pos++) {
var item = (pos+i) < arr.length ? arr[pos+i] : arr[pos+i-arr.length];
console.log(item);
}
}