Ich versuche, zwei Arrays zu kombinieren, und die meisten Antworten beziehen sich auf das Hinzufügen des zweiten Arrays am Ende des ersten. Ich muss Index zu Index zusammenführen.

Hier ist ein Beispielcode:

let arr1 = ['golf', 'hockey', 'tennis'];
let arr2 = ['player1', 'player2', 'player3'];

Array.prototype.zip = function (arr) {
  return this.map(function (e, i) {
    return [ e, arr[i]];
  })
};
const arr3 = arr1.zip(arr2);
console.log(arr3);

Das Ergebnis sollte sein:

['golf', 'player1', 'hockey', 'player2', 'tennis', 'player3']

Der obige Code scheint zu funktionieren, funktioniert aber nicht. Wenn es repariert oder zum Besseren ausgetauscht werden kann, wäre das großartig .....

5
Mark Hayden 19 Apr. 2018 im 06:43

4 Antworten

Beste Antwort

Sie können .reduce() verwenden, um beide Arrays zu komprimieren:

let arr1 = ['golf', 'hockey', 'tennis'],
    arr2 = ['player1', 'player2', 'player3'];

let zip = (a1, a2) => a1.reduce((a, c, i) => (a.push(c, a2[i]), a), []);

console.log(zip(arr1, arr2));

Dokumente:

3
Mohammad Usman 19 Apr. 2018 im 03:51

.map ordnet ein Array einem anderen Array eins zu eins zu: Wenn das ursprüngliche Array 3 Elemente enthält, kann .map immer nur ein anderes Array mit 3 Elementen erstellen. Wenn Sie concat nicht verwenden können, verwenden Sie .reduce anstelle von .map. Auf diese Weise können Sie mehrere Elemente in einer einzigen Iteration verschieben:

const arr1 = ['golf', 'hockey', 'tennis'];
const arr2 = ['player1', 'player2', 'player3']

Array.prototype.zip = function (otherArr) {
  return this.reduce((accum, item, i) => {
    accum.push(item);
    accum.push(otherArr[i]);
    return accum;
  }, []);
};
const arr3 = arr1.zip(arr2)
console.log(arr3)

Natürlich wäre es viel besser, das eingebaute Array-Objekt nicht zu ändern. Sie können dies leicht vermeiden, indem Sie stattdessen eine eigenständige Funktion verwenden:

const arr1 = ['golf', 'hockey', 'tennis'];
const arr2 = ['player1', 'player2', 'player3']

function zip(arr1, arr2) {
  return arr1.reduce((accum, item, i) => {
    accum.push(item);
    accum.push(arr2[i]);
    return accum;
  }, []);
};
const arr3 = zip(arr1, arr2);
console.log(arr3);
0
CertainPerformance 19 Apr. 2018 im 03:48

Eine einfache Lösung: Reduzieren Sie einfach das, was Sie jetzt haben, mit einem einfachen Reduzieren ():

let arr1 = ['golf', 'hockey', 'tennis'];
let arr2 = ['player1', 'player2', 'player3']

Array.prototype.zip = function (arr) {
      return this.map(function (e, i) {
          return [ e, arr[i]]
      }).reduce((a,b)=>a.concat(b)); // blink and you miss the change...
    };
const arr3 = arr1.zip(arr2)
console.log(arr3)

Dieser Ansatz bewahrt das, was Sie haben, und fügt nicht viel Komplexität hinzu, wie zusätzliche Methodenaufrufe, temporäre Arrays usw.; Das ist das Schöne am funktionalen Ansatz: Sie sind ein Kettenglied von dem entfernt, was Sie brauchen. Ich würde es auch in eine Stand-Along-Methode konvertieren, anstatt den Prototyp zu modifizieren, aber das ist nicht der Punkt ...

0
dandavis 19 Apr. 2018 im 05:25

Sie können ein temporäres Array anstelle einer direkten Eingabemethode verwenden.

let arr1 = ['golf', 'hockey', 'tennis'];
let arr2 = ['player1', 'player2', 'player3']

Array.prototype.zip = function (arr) {
    this.map(function (e, i) { this.splice(i*2+1, 0, arr[i]); }, this )
};
const arr3 = arr1.zip(arr2)
console.log(arr3)
1
Sergio Reis 19 Apr. 2018 im 07:20