2016-04-08 10 views
0

Bei Arrays arr1, arr2 und newArr (zum Beispiel):Merging zwei Javascript-Arrays drei Elemente zu einer Zeit

var arr1 = ["a1", "a2", "a3", "a4", "a5"] 
var arr2 = ["b1", "b2", "b3", "b4", "b5"] 
var newArr = ["a1", "a2", "a3", "b1", "b2", "b3", "a4", "a5", "b4", "b5"] 

ich zwei Arrays zu verbinden versuchen (arr1 und arr2) in ein Array (newArr) , in der Weise, dass die ersten newArr packt (bis zu) drei Elemente aus arr1, dann dem ersten (bis zu) drei aus arr2, dann wird die nächste (bis zu) drei aus arr1 usw.

Ich hatte mich anfänglich diesem Thema genähert, indem ich jedes Element von arr1 durchlaufen und überprüft habe, ob der Index durch drei teilbar ist (for (var i = 0) ... if (i + 1 % 3 === 0)), aber jetzt denke ich, dass dieser Ansatz unhaltbar ist, wenn arr1.length % 3 !== 0.

Gibt es auch einen Namen für diese Art von Merge-Verfahren?

+0

Sind Ihre Arrays gleich lang? Kannst du klarer sein, wenn du wirklich verschiedene Input-Arrays verwendest? –

+0

Ja - meine Arrays sind gleich lang. Ich werde mein Snippet bearbeiten, um die Arrays besser zu unterscheiden. – alex

+1

_ist ein Name für diese Art von merge procedure_ gut, die Abteilung wird manchmal als [chunking] (http://stackoverflow.com/questions/8495687/split-array-into-chunks); Diese Frage zu verwenden und die Ergebnisse zu "concat" sollten Sie dahin bringen, wo Sie hin wollen. – Mathletics

Antwort

2

Wie wäre es ...

var arr1 = ["a1", "a2", "a3", "a4", "a5"] 
var arr2 = ["b1", "b2", "b3", "b4", "b5"] 
newArr = [] 
t1 = t2 = temp = [] 

while(arr1.length) { 
    t1 = arr1.splice(0,3) 
    t2 = arr2.splice(0,3) 
    temp = t1.concat(t2) 
    newArr = newArr.concat(temp) 
} 
console.log(newArr) 
+0

Dieser Ansatz ist dem am ähnlichsten, mit dem ich am Ende war - es bleibt einfach. Vielen Dank! – alex

1

Entschuldigen Sie, haben Sie eine Minute über unseren Herrn und Heiland, Rekursion zu sprechen?

/** 
* @param {number[]} arr1 
* @param {number[]} arr2 
*/ 
function threeMerge(arr1, arr2) { 

    /** 
    * @param {number[]} arr1 
    * @param {number[]} arr2 
    * @param {number[]} currentArr 
    */ 
    var threeMergeRecursive = function(arr1, arr2, currentArr) { 
     if(arr1.length < 3 || arr2.length < 3){ 
      return currentArr.concat(arr1, arr2); 
    } else if (arr2.length < 3) { 
     var resultArr = currentArr.concat(
      arr1.slice(0, 3), 
      arr2 
     ); 

     return threeMergeRecursive(
      arr1.slice(0, 3), 
      [], 
      resultArr 
     ); 
    } else { 
      var resultArr = currentArr.concat(
       arr1.slice(0, 3), 
       arr1.slice(0, 3) 
       ); 

      return threeMergeRecursive(
       arr1.slice(3), 
       arr2.slice(3), 
       resultArr); 
     } 
    }; 

    return(threeMergeRecursive(arr1, arr2, [])); 
}; 
1

Grundlegende Lösung ist eine Schleife mit zwei Indizes gleichzeitig. Hier ist Lösung

var arr1 = ["a1", "a2", "a3", "a4", "a5"], 
    arr2 = ["b1", "b2", "b3", "b4", "b5"], 
    newArr = []; 

for (let a=0, b=0; a<arr1.length || b<arr2.length;) { 
    if (a==b) { 
    newArr.push(...arr1.slice(a,a+=3)) } 
    else { 
    newArr.push(...arr2.slice(b,b+=3)) } 
} 

Bitte beachten Sie Beispielcode verwenden let und Array Unboxing ES6 Funktionen.

Verwandte Themen