每个第n个图像,其余部分为下一个循环偏移

时间:2015-03-27 14:54:48

标签: javascript loops modulus

我有两个值表示从一些数据中解析多少结果以及我想要定位的第n个项目。在这种情况下,它使每个第n项成为大图像,其余为正常大小。这就是我需要循环做的事情:

  • 第一张图片必须很大,或者可以选择开启
  • 最后获取正常尺寸图像的剩余部分
  • 使用此余数,以便在下一个大图像出现之前,对数据的下一次迭代具有正确的起点。

我非常接近,但我的模数是错误的,或者我是如何进行检查的。

var i = 0,
len = productsObj.products.length;

for (i; i < len; i++) {
    if ((i + this.nthProductImageOffset) % NTH_PRODUCT_IS_LARGE_TILE === 0) {
        productsObj.products[i].PhotoSize = 'large';
    } else {
        productsObj.products[i].PhotoSize = 'medium';
    }
}

// Store the remainder of medium tiles, if any, to be calculated
// against the next set of products to be appended.
this.nthProductImageOffset = i % NTH_PRODUCT_IS_LARGE_TILE;

所以,如果我的两个初始值是: NTH_PRODUCT_IS_LARGE_TILE = 7 productsObj.products.length = 30

第一张图片很大,然后每​​第7张图片都很大。如果我们在循环结束时剩下2个中等图像的剩余部分,那么下次我们在另一个大图像出现之前运行循环时需要考虑这一点。这样,无论第n个数量或迭代次数如何,我们将始终在大数量之间具有正确数量的中间切片。

3 个答案:

答案 0 :(得分:1)

上面代码的问题似乎是你对偏移量的使用。您需要将偏移量更新为i +的模数+您之前的偏移量。不仅仅是我。

例如:

this.nthProductImageOffset = (i + this.nthProductImageOffset) % NTH_PRODUCT_IS_LARGE_TILE;

这是一个视觉jsFiddle示例:https://jsfiddle.net/kwandrews7/6jxsu91y/1/

每次单击运行按钮时,5个元素都将添加到列表中。第7个元素将始终为LARGE,而其他元素将为MEDIUM。祝你好运。

HTML:

<button id="run">Run</button>
<ol id="list">
</ol>

javascript:

var btnAdd = document.getElementById('run');
btnAdd.addEventListener("click", addElement, false);

var offset = 0

function addElement() {

    var olList = document.getElementById('list');
    var newListItem = document.createElement('li');
    newListItem.innerText = 'New Item';

    var len = 5;
    var mod = 7;

    for (var i=0; i<len; i++) {
        var iOffset = i + offset;
        if ( iOffset % mod === 0) {
            var newListItem = document.createElement('li');
            newListItem.innerText = "LARGE: i(" + i + "), offset(" + offset + "), iOffset(" + iOffset + ")";
            olList.appendChild(newListItem);
        } else {
            var newListItem = document.createElement('li');
            newListItem.innerText = "MEDIUM: i(" + i + "), offset(" + offset + "), iOffset(" + iOffset + ")";
            olList.appendChild(newListItem);
        }
    }
    offset = (i+offset) % mod

}

答案 1 :(得分:0)

试试这个:

var j = 0;

function run(list) {
    for(var i = 0; i < list.length; i++) {
        if(j % 7 === 0) {
            console.log(list[i] + ' large');
        }
        else {
            console.log(list[i] + ' medium');
        }

        j += 1;
    }
}

run([1, 2, 3]);
run([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]);
run([16, 17, 18]);

您使用j跟踪所有列表中的所有项目,并针对NTH_PRODUCT_IS_LARGE_TILE进行检查,以便您不必关心list.length

http://jsfiddle.net/nx3jswyk/

输出:

1 large
2 medium
3 medium
4 medium
5 medium
6 medium
7 medium
8 large
9 medium
10 medium
11 medium
12 medium
13 medium
14 medium
15 large
16 medium
17 medium
18 medium

答案 2 :(得分:0)

好的,所以我尝试了您的代码,只有在初始化nthProductImageOffset时才有效。只需添加

nthProductImageOffset = 0;

到你的代码的开头,你应该好好去