1464 Stimmen

Wie man ein bestehendes JavaScript-Array mit einem anderen Array erweitert, ohne ein neues Array zu erstellen

Es scheint keine Möglichkeit zu geben, ein bestehendes JavaScript-Array mit einem anderen Array zu erweitern, d.h. Pythons extend Methode.

Ich möchte Folgendes erreichen:

>>> a = [1, 2]
[1, 2]
>>> b = [3, 4, 5]
[3, 4, 5]
>>> SOMETHING HERE
>>> a
[1, 2, 3, 4, 5]

Ich weiß, es gibt eine a.concat(b) Methode, aber sie erstellt ein neues Array, anstatt einfach das erste zu erweitern. Ich hätte gerne einen Algorithmus, der effizient arbeitet, wenn a deutlich größer ist als b (d.h. eine, die nicht kopiert a ).

<em><strong>Nota: </strong>Dies ist <strong>nicht ein Duplikat von <a href="https://stackoverflow.com/questions/351409/appending-to-array">Wie kann man etwas an ein Array anhängen? </a></strong>-- Ziel ist es hier, den gesamten Inhalt eines Arrays dem anderen hinzuzufügen, und zwar "an Ort und Stelle", d.h. ohne alle Elemente des erweiterten Arrays zu kopieren.</em>

10 Stimmen

Aus @Zahnbürste's Kommentar zu einer Antwort: a.push(...b) . Das Konzept ähnelt dem der ersten Antwort, wurde aber für ES6 aktualisiert.

0 Stimmen

>>> a.push(...b)

5voto

Diese Lösung funktioniert bei mir (unter Verwendung des Spread-Operators von ECMAScript 6):

let array = ['my', 'solution', 'works'];
let newArray = [];
let newArray2 = [];
newArray.push(...array); // Adding to same array
newArray2.push([...array]); // Adding as child/leaf/sub-array
console.log(newArray);
console.log(newArray2);

4voto

vitaly-t Punkte 22010

Ich füge diese Antwort hinzu, denn obwohl die Frage eindeutig besagt without creating a new array so gut wie jede Antwort ignoriert sie einfach.

Modernes JavaScript arbeitet gut mit Arrays und ähnlichem als iterierbare Objekte. Dies macht es möglich, eine Version von concat die darauf aufbaut und die Array-Daten logisch über ihre Parameter verteilt.

Das folgende Beispiel verwendet die iter-ops Bibliothek, die eine solche Logik enthält:

import {pipe, concat} from 'iter-ops';

const i = pipe(
    originalArray,
    concat(array2, array3, array4, ...)
); //=> Iterable

for(const a of i) {
    console.log(a); // joint values from all arrays
}

Oben wird kein neues Array erstellt. Operator konkaten iteriert durch das ursprüngliche Array und fährt dann automatisch in array2 dann array3 und so weiter, in der angegebenen Reihenfolge.

Dies ist die effizienteste Art, Arrays in Bezug auf Leistung und Speicherverbrauch zu verbinden.

Und wenn Sie am Ende beschließen, es in ein tatsächliches physisches Array umzuwandeln, können Sie dies mit dem Standard-Spread-Operator tun:

const fullArray = [...i]; // pulls all values from iterable, into a new array

0voto

user3126309 Punkte 31

Eine andere Lösung zum Zusammenführen von mehr als zwei Arrays

var a = [1, 2],
    b = [3, 4, 5],
    c = [6, 7];

// Merge the contents of multiple arrays together into the first array
var mergeArrays = function() {
 var i, len = arguments.length;
 if (len > 1) {
  for (i = 1; i < len; i++) {
    arguments[0].push.apply(arguments[0], arguments[i]);
  }
 }
};

Dann aufrufen und drucken als:

mergeArrays(a, b, c);
console.log(a)

Die Ausgabe wird sein: Array [1, 2, 3, 4, 5, 6, 7]

0voto

Mr. Polywhirl Punkte 34960

Sie können ein Polyfill für extend erstellen, wie ich es unten getan habe. Es wird zu dem Array hinzufügen; in-place und zurück selbst, so dass Sie andere Methoden verketten können.

if (Array.prototype.extend === undefined) {
  Array.prototype.extend = function(other) {
    this.push.apply(this, arguments.length > 1 ? arguments : other);
    return this;
  };
}

function print() {
  document.body.innerHTML += [].map.call(arguments, function(item) {
    return typeof item === 'object' ? JSON.stringify(item) : item;
  }).join(' ') + '\n';
}
document.body.innerHTML = '';

var a = [1, 2, 3];
var b = [4, 5, 6];

print('Concat');
print('(1)', a.concat(b));
print('(2)', a.concat(b));
print('(3)', a.concat(4, 5, 6));

print('\nExtend');
print('(1)', a.extend(b));
print('(2)', a.extend(b));
print('(3)', a.extend(4, 5, 6));

body {
  font-family: monospace;
  white-space: pre;
}

0voto

zCoder Punkte 103

Die Kombination der Antworten...

Array.prototype.extend = function(array) {
    if (array.length < 150000) {
        this.push.apply(this, array)
    } else {
        for (var i = 0, len = array.length; i < len; ++i) {
            this.push(array[i]);
        };
    }  
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X