Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从起始索引高于“array.length”的数组中选择N个项?_Javascript_Jquery_Arrays_Sorting - Fatal编程技术网

Javascript 如何从起始索引高于“array.length”的数组中选择N个项?

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> 如果

如果我有一个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>
如果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;i=len{ ads.eqi-len.removeClass'hide'; }否则{ 移除类“隐藏”; } } .隐藏{ 显示:无; } 1. 2. 3. 4.
5如果我理解正确,并且我仍然认为示例与文本相矛盾,那么在没有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);
  }
}