循环两个不同长度的数组,并正确排序输出

时间:2016-10-17 20:28:54

标签: javascript arrays


假设您有两个阵列 - 标题内容 标题将包含1,2或3个字符串。 content 将包含3个,6个或9个字符串。

我需要遍历这些数组。 我试图得到的输出:

Headline1
Content1
Content2
Content3
Headline2
Content4
Content5
Content6
Headline3
Content7
Content8
Content9

这个嵌套循环不起作用,因为它将每个内容放在每个标题下面。

headline = ["Headline1", "Headline2", "Headline3"];
content = ["Content1", "Content2", "Content3", 
           "Content4", "Content5", "Content6",
           "Content7", "Content8", "Content9"];

for(var i = 0; i < headline.length; i++){
    console.log(headline[i]);
  for(var j = 0; j < content.length; j++){
    console.log(content[j]);
  }
}

我从表单中获取字符串,然后将它们推入数组中 数组的长度取决于用户希望使用的字段数 关于如何解决这个问题的任何建议?

6 个答案:

答案 0 :(得分:2)

内循环应该只循环3次,而不是所有content.length循环。要在内容中获取相应的条目,请使用i*3+j

headline = ["Headline1", "Headline2", "Headline3"];
content = ["Content1", "Content2", "Content3",
  "Content4", "Content5", "Content6",
  "Content7", "Content8", "Content9"
];

for (var i = 0; i < headline.length; i++) {
  console.log(headline[i]);
  for (var j = 0; j < 3; j++) {
    console.log(content[i * 3 + j]);
  }
}

答案 1 :(得分:1)

您错过了一些有价值的信息。你需要知道有多少&#34;内容&#34;你放在每个&#34;标题&#34;下面。根据您提供的数据,如果它可以是1,2或3,则无法确定。

当你收到内容时你需要做的是做一个数组(或其他一些结构)数组来组合正确的字段。

var headline = ["Headline1", "Headline2", "Headline3"];
var content = [["Content1", "Content2", "Content3"], 
           ["Content4", "Content5", "Content6"],
           ["Content7", "Content8", "Content9"]];

注意额外的[]分组内容对。

在那之后,它相当琐碎。

for(var i = 0; i < headline.length; i++){
    console.log(headline[i]);
  for(var j = 0; j < content[i].length; j++){
    console.log(content[i][j]);
  }
}

注意到我们现在正在使用content[i].length代替content.lengthcontent[i][j]代替console.log,而不只是content[j]

对于每个标题-n,我们获取第n组内容并循环遍历这些内容。

顺便说一下,出于性能考虑,最好将长度保存到循环中的变量中:

for(var i = 0, iLen = headline.length; i < iLen; i++) { 
    console.log(headline[i]);
    for (var j = 0, jLen = content[i].length; j < jLen; j++) {
        console.log(content[i][j]);
    }
}

这样做可以避免对长度进行大量检查,这可以对大量结果产生影响。

答案 2 :(得分:0)

您可以使用单个循环并根据内容和标题长度获取标题。

var headline = ["Headline1", "Headline2", "Headline3"],
    content = ["Content1", "Content2", "Content3", "Content4", "Content5", "Content6", "Content7", "Content8", "Content9"],
    l = Math.floor(content.length / headline.length);
		
content.forEach(function (a, i) {
    if (!(i % l) ) {
        console.log(headline[Math.floor(i / l)]);
    }
    console.log(a);
});

答案 3 :(得分:0)

我建议将数据重新排列为对象数组,例如:

headlines = [
{ 
  title:  'Headline1',
  contents: [
    "Content1", 
    "Content2", 
    "Content3"
  ]
},{ 
  title:  'Headline2',
  contents: [
    "Content4", 
    "Content5", 
    "Content6"
  ]
},
{ ... }
];

如果由于某些原因无法执行此操作,则以下循环应该有效:

headline = ["Headline1", "Headline2", "Headline3"];
content = ["Content1", "Content2", "Content3", 
           "Content4", "Content5", "Content6",
           "Content7", "Content8", "Content9"];

for(var i=0, l=headline.length; i<l; i++){
  console.log(headline[i]);
  for(var j=i*3; j<3*i+3; j++){
    console.log(content[j]);
  }
}

干杯!

答案 4 :(得分:0)

这是一个简单的程序化解决方案:

var j=0,k=1;
var iter=content.length/headline.length;

for(var i=0;i<iter;i++){
    console.log(headline[i]);
    for(;j<headline.length*k;j++){
       console.log(content[j]);
   }
    k+=1;
}

请参阅在控制台上工作:https://jsfiddle.net/7un047q6/

答案 5 :(得分:0)

另一种方法可能是......

var headline = ["Headline1", "Headline2", "Headline3"],
     content = ["Content1", "Content2", "Content3", "Content4", "Content5", "Content6", "Content7", "Content8", "Content9"],
      result = headline.reduce((p,h,i) => [...p,h,...content.slice(i*3,i*3+3)],[]);
console.log(result);