1252 Stimmen

Kopieren von Array-Elementen in ein anderes Array

Ich habe ein JavaScript-Array dataArray die ich in ein neues Array schieben möchte newArray . Nur will ich nicht newArray[0] zu sein dataArray . Ich möchte alle Elemente in das neue Array schieben:

var newArray = [];

newArray.pushValues(dataArray1);
newArray.pushValues(dataArray2);
// ...

oder noch besser:

var newArray = new Array (
   dataArray1.values(),
   dataArray2.values(),
   // ... where values() (or something equivalent) would push the individual values into the array, rather than the array itself
);

Das neue Array enthält nun also alle Werte der einzelnen Daten-Arrays. Gibt es eine Kurzschrift wie pushValues zur Verfügung, so dass ich nicht jeden einzelnen Schritt durchlaufen muss. dataArray , indem Sie die Elemente nacheinander hinzufügen?

22voto

shaunc Punkte 4883

Das Folgende erscheint mir am einfachsten:

var newArray = dataArray1.slice();
newArray.push.apply(newArray, dataArray2);

Da "push" eine variable Anzahl von Argumenten benötigt, können Sie die apply Methode der push Funktion, um alle Elemente eines anderen Arrays zu verschieben. Sie konstruiert einen Aufruf von push mit seinem ersten Argument (hier "newArray") als "this" und den Elemente des Arrays als die übrigen Argumente.

En slice in der ersten Anweisung erhält eine Kopie des ersten Arrays, so dass Sie es nicht ändern.

Update Wenn Sie eine Version von Javascript mit Slice verwenden, können Sie die push Ausdruck zu:

newArray.push(...dataArray2)

19voto

Ryan H. Punkte 6534

Mit JavaScript ES6 können Sie den ... Operator als Spreizungsoperator verwenden, der das Array im Wesentlichen in Werte umwandelt. Dann können Sie etwas wie dieses tun:

const myArray = [1,2,3,4,5];
const moreData = [6,7,8,9,10];

const newArray = [
  ...myArray,
  ...moreData,
];

Die Syntax ist zwar prägnant, aber ich weiß nicht, wie dies intern funktioniert und welche Auswirkungen auf die Leistung bei großen Arrays zu erwarten sind.

16voto

Sébastien VINCENT Punkte 1076
var a=new Array('a','b','c');
var b=new Array('d','e','f');
var d=new Array('x','y','z');
var c=a.concat(b,d)

Ist Ihr Problem damit gelöst?

13voto

Panos Theof Punkte 1433

Die nachstehende Funktion hat kein Problem mit der Länge von Arrays und funktioniert besser als alle vorgeschlagenen Lösungen:

function pushArray(list, other) {
    var len = other.length;
    var start = list.length;
    list.length = start + len;
    for (var i = 0; i < len; i++ , start++) {
        list[start] = other[i];
    }
}

Leider weigert sich jspref, meine Eingaben zu akzeptieren, daher hier die Ergebnisse mit benchmark.js

        Name            |   ops/sec   |  ± %  | runs sampled
for loop and push       |      177506 |  0.92 | 63
Push Apply              |      234280 |  0.77 | 66
spread operator         |      259725 |  0.40 | 67
set length and for loop |      284223 |  0.41 | 66

wobei

for-Schleife und push ist:

    for (var i = 0, l = source.length; i < l; i++) {
        target.push(source[i]);
    }

Anwenden drücken:

target.push.apply(target, source);

Spread-Operator:

    target.push(...source);

und schließlich ist die 'set length and for loop' die obige Funktion

11voto

orad Punkte 13913

Wenn Sie das ursprüngliche Array ändern möchten, können Sie es verteilen und verschieben:

var source = [1, 2, 3];
var range = [5, 6, 7];
var length = source.push(...range);

console.log(source); // [ 1, 2, 3, 5, 6, 7 ]
console.log(length); // 6

Wenn Sie sicherstellen möchten, dass nur Artikel desselben Typs in die source Array (z. B. keine Zahlen und Strings mischen), dann verwenden Sie TypeScript.

/**
 * Adds the items of the specified range array to the end of the source array.
 * Use this function to make sure only items of the same type go in the source array.
 */
function addRange<T>(source: T[], range: T[]) {
    source.push(...range);
}

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