迭代数组时包含每三个元素

时间:2014-12-03 16:43:18

标签: javascript arrays

我有一个二维数组(affiliates),其中每个数组项都包含一个图像URL和一个链接URL。 randArray只是一个生成的随机数列表(非重复),与affiliates的长度相匹配。

我已经达到了可以为随机图像/网址组合成功生成HTML字符串的程度。

(以上可能是比需要更多的信息,但我想提供一些背景知识。)

我要做的是将每三次迭代分组并包装在<p>标签中。我已经尝试在当前的一个内部执行嵌套循环,但只能到达<p>标记中包含三个相同行的位置,而我需要它们连续三个线。我觉得这应该很容易,但我很难过。任何帮助将非常感激。

for(var y=0; y < randArray.length; y++) {

    var image = affiliates[randArray[y]][0];
    var url = affiliates[randArray[y]][1];

    var fullString = '<a href="' + url + '"><img src="' + image + '"></a>';
    console.log(fullString);

}

4 个答案:

答案 0 :(得分:2)

在你的循环中,y % 3 == 0将在第一次迭代时为真,并且在其后的每三次都是如此,因此在<p>时输出y % 3 == 0,在{{1}时输出</p>如果是y % 3 == 2,那么在你的循环之后。

但嵌套循环可能更容易做和维护:

length % 3 != 0

答案 1 :(得分:1)

for(var y=0; y < randArray.length; y++) {

var image = affiliates[randArray[y]][0];
var url = affiliates[randArray[y]][1];
var fullString = '';
if(y%3 == 2){
    fullString += '<p>';
} 
fullString = '<a href="' + url + '"><img src="' + image + '"></a>';
if(y%3 == 2){
    fullString += '</p>';
} 
console.log(fullString);

}

答案 2 :(得分:1)

我不确定我是否理解,但......

var t = [];
for(var i=0;i<affiliates.length;i++) t.push(i);
while(t.length>2){
 var str = '';
 for(var i=0;i<3;i++){
  str += '<a href="';
  var r = Math.floor(Math.random()*t.length);
  str += affiliates[t[r]][1] + '"><img src="';
  str += affiliates[t[r]][0] + '"></a>';
  t.splice(r,1);
 }
 str = '<p>'+str+'</p>';
 console.log(str);
}

答案 3 :(得分:0)

我会做这样的事情,但它不是优化代码,对不起:/

var counter = 1; //external counter for module (%3)
var open = false;
var tagOpen = '<p>';
var tagClose = '</p>';
var fullstring = '';
var buffer = ''

for(var y=0; y < randArray.length; y++) {

    var image = affiliates[randArray[y]][0];
    var url = affiliates[randArray[y]][1];    

    //groups entries 
    buffer += '<a href="' + url + '"><img src="' + image + '"></a>';

    if(counter % 3 == 0){
        fullstring = tagOpen + buffer + tagClose; //concat strings
        console.log(fullString);
        open = false; //set open to false
    } else {
        open = true;
    }

    counter++;
}

//if at the end of the loop there's still an open tag, close it
if(open){
    fullstring += tagClose;
}