循环通过两个(不同的加长)数组以产生交替输出

时间:2016-08-02 12:26:04

标签: javascript arrays loops

循环通过两个数组以产生交替输出的有效方法是什么?在JavaScript中。

如果我有两个这样的数组:

var oddNumbers = [1, 3, 5, 7, 9]
var evenNumbers = [2, 4, 6, 8, 10, 12, 14]

注意:数组的长度可能不一样

如何获得以下输出?

  

输出:1,2,3,4,5,6,7,8,9,10,12,14

我原以为这会起作用:

if (oddNumber.length > evenNumbers.length) {
    var large = oddNumbers;
} else {
    var large = evenNumbers;
}
for(var i = 0; i < large.length; i++){
    if (evenNumbers.length >= i && oddNumbers.length >= i) {
        console.log(oddNumbers[i] + ", " + evenNumbers[0]);
    } elseif (evenNumbers.length >= i) {
        console.log(evenNumbers[0]);
    } else {
        console.log(oddNumbers[0]);
    }
}

但它很乱,有没有更好的方法来接近这个?

注意:这些可能不一定是数字顺序,或实际数字

9 个答案:

答案 0 :(得分:1)

如果您只想输出它们,我宁愿按照以下方式执行:

&#13;
&#13;
var oddNumbers = [1, 3, 5, 7, 9];
var evenNumbers = [2, 4, 6, 8, 10, 12, 14];
for (var i=0, j=0; i < oddNumbers.length || j < evenNumbers.length;) {
  if (i < oddNumbers.length) {
    console.log(oddNumbers[i++]);
  }
  if (j < evenNumbers.length) {
    console.log(evenNumbers[j++]);
  }
}
&#13;
&#13;
&#13;

如果要将合并结果作为另一个数组获取,可以将console.log替换为result.push,以将结果值推送到名为result的数组上,如下所示:

&#13;
&#13;
var oddNumbers = [1, 3, 5, 7, 9];
var evenNumbers = [2, 4, 6, 8, 10, 12, 14];
var result = [];
for (var i=0, j=0; i < oddNumbers.length || j < evenNumbers.length;) {
  if (i < oddNumbers.length) {
    result.push(oddNumbers[i++]);
  }
  if (j < evenNumbers.length) {
    result.push(evenNumbers[j++]);
  }
}
console.log(result);
&#13;
&#13;
&#13;

这样你就可以迭代这两个数组,只要其中一个数组有一个我们还没有访问过的元素,并且还可以防止在同一个数组的相同索引上迭代两次。请注意,我在if块中使用了increment来保存2行代码。您也可以将它们移动到for循环中,因为它们不会破坏if语句。

答案 1 :(得分:1)

var oddNumbers = [1, 3, 5, 7, 9];
var evenNumbers = [2, 4, 6, 8, 10, 12, 14];

var oLength = oddNumbers.length;
var eLength = evenNumbers.length;
var n = oLength > eLength ? oLength : eLength;
var rez=[];


for(i=0;i<n;i++){
 if (i< oLength) rez.push(oddNumbers[i])
 if (i<eLength)  rez.push(evenNumbers[i])
}
console.log(rez);


var odd = ["A", "C","E","G"];
var even = ["B","D","F"];
var rez=[];
for(i=0;i<(odd.length > even.length ? odd.length : even.length);i++){
 if (i< odd.length) rez.push(odd[i])
 if (i<even.length)  rez.push(even[i])
}
console.log(rez);

答案 2 :(得分:1)

以下函数接受两个数组并将其交错值作为新数组返回:

function interleaveArrays(a, b) {

  var array = [],
      limit = a.length >= b.length ? a.length : b.length;
      index = 0;

  while (index < limit) {
    a[index] && array.push(a[index]);
    b[index] && array.push(b[index]);
    index += 1;
  }

  return array;
}

像这样调用函数:

var oddNumbers  = [1, 3, 5, 7, 9],
    evenNumbers = [2, 4, 6, 8, 10, 12, 14];

console.log(interleaveArrays(oddNumbers, evenNumbers));

收率:

[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14 ]

然后您可以按照首选方式输出; e.g:

var interleaved = interleaveArrays(oddNumbers, evenNumbers);

// as a loop
interleaved.forEach(function (n) {
  console.log(n);
})

// or as a string
console.log(interleaved.join(', ')); 

// etc.

希望这会有所帮助:)

答案 3 :(得分:0)

屏幕上会有额外的,。如果您不想要

,请添加if声明
 for(var i = 0; i < large.length; i++){
 if(i<evenNumbers.length)
    console.log(evenNumbers[i]+","); 
 if(i<oddNumber.length)
   console.log(evenNumbers[i]+","); 
}

答案 4 :(得分:0)

我做这样的事情。

large = (oddNumber.length >= evenNumbers.length) ? oddNumbers : evenNumbers;
small = (oddNumber.length < evenNumbers.length) ? oddNumbers : evenNumbers;

for(var i = 0; i < large.length; i++){
    if(small.length <= i + 1){
        console.log(small[i] + ", "+ large[i]);
    }
    else {
        console.log(large[i]);
    }
}

答案 5 :(得分:0)

我只需合并两个数组并对其进行排序

var oddNumbers = [1, 3, 5, 7, 9];
var evenNumbers = [2, 4, 6, 8, 10, 12, 14];
var mergedArr=oddNumbers.concat(evenNumbers );
console.log(mergedArr.sort(function(a,b){return a-b;}));

看到没有循环..没有麻烦。非常简单

答案 6 :(得分:0)

如何做到这一点的长篇例子。代码可以缩小以获得最终解决方案。我使用的基本原则是均匀地处理尾部的交替标记

&#13;
&#13;
var oddNumbers = [1, 3, 5, 7, 9];
var evenNumbers = [2, 4, 6, 8, 10, 12, 14];

var oLength = oddNumbers.length;
var eLength = evenNumbers.length;

var oTemp, eTemp, remainder;

if(oLength > eLength) {
  eTemp = evenNumbers;
  oTemp = oddNumbers.slice(0, eLength);
  remainder = oddNumbers.slice(eLength);
} else if (eLength > oLength) {
  eTemp = evenNumbers.slice(0, oLength);
  oTemp = oddNumbers;
  remainder = evenNumbers.slice(oLength);
} else {
  eTemp = evenNumbers;
  oTemp = oddNumbers;
  remainder = [];
}

var final = [];

for(var i=0; i < eTemp.length; i++) {
  final.push(oTemp[i]);
  final.push(eTemp[i]);
}

final = final.concat(remainder);

alert(final);
&#13;
&#13;
&#13;

答案 7 :(得分:0)

试试这个它总是可以使用数字数组或字符串数​​组:

var oddNumber = [1, 3, 5, 7, 9]
var evenNumber = [2, 4, 6, 8, 10, 12, 14]
var margedNumbers = oddNumber.concat(evenNumber);
console.log("before: "+margedNumbers);
margedNumbers.sort(function(a, b){return a-b})
console.log("after: "+margedNumbers)

答案 8 :(得分:0)

我的解决方案

var oddNumbers = [1, 3, 5, 7, 9]
var evenNumbers = [2, 4, 6, 8, 10, 12, 14]
var extraElements = (oddNumbers.length > evenNumbers.length) ? oddNumbers.slice(evenNumbers.length) : evenNumbers.slice(oddNumbers.length);
var finalArr = [];
var small = (oddNumbers.length < evenNumbers.length) ? oddNumbers : evenNumbers;
small.forEach((each, index) => {
  // merge elements in desired order
  finalArr.push(oddNumbers[index]);
  finalArr.push(evenNumbers[index]);
})
finalArr = finalArr.concat(extraElements);
alert(finalArr);
提取额外的元素,使两个数组的长度相同。然后,在一个简单的迭代中,从两个数组推送具有相同索引的元素。