So fügen Sie einem Array ein Objekt hinzu

317

Wie kann ich einem Array ein Objekt hinzufügen (in Javascript oder JQuery)? Was ist beispielsweise das Problem mit diesem Code?

function(){
    var a = new array();
    var b = new object();
    a[0]=b;
}

Ich möchte diesen Code verwenden, um viele Objekte im Array von function1 zu speichern und function2 aufzurufen, um das Objekt im Array zu verwenden.

  1. Wie kann ich ein Objekt in einem Array speichern?
  2. Wie kann ich ein Objekt in ein Array einfügen und in einer Variablen speichern?
naser
quelle
12
Bitte korrigieren Sie keine Fehler im veröffentlichten Code, wie dies bei Bearbeitung 5 der Fall war. Wenn Sie einen einfachen Fehler in der Frage korrigieren, gibt es häufig keinen Grund für die Antwort.
Paul
Auch wurde pushhier schon mehrfach vorgeschlagen. Bitte verschmutzen Sie diesen Thread nicht mehr mit einem anderen pushVorschlag.
Boghyon Hoffmann

Antworten:

630

Fügen Sie mit Array.push () alles in ein Array ein.

var a=[], b={};
a.push(b);    
// a[0] === b;

Zusätzliche Informationen zu Arrays

Fügen Sie mehrere Elemente gleichzeitig hinzu

var x = ['a'];
x.push('b', 'c');
// x = ['a', 'b', 'c']

Fügen Sie Elemente am Anfang eines Arrays hinzu

var x = ['c', 'd'];
x.unshift('a', 'b');
// x = ['a', 'b', 'c', 'd']

Fügen Sie den Inhalt eines Arrays einem anderen hinzu

var x = ['a', 'b', 'c'];
var y = ['d', 'e', 'f'];
x.push.apply(x, y);
// x = ['a', 'b', 'c', 'd', 'e', 'f']
// y = ['d', 'e', 'f']  (remains unchanged)

Erstellen Sie ein neues Array aus dem Inhalt von zwei Arrays

var x = ['a', 'b', 'c'];
var y = ['d', 'e', 'f'];
var z = x.concat(y);
// x = ['a', 'b', 'c']  (remains unchanged)
// y = ['d', 'e', 'f']  (remains unchanged)
// z = ['a', 'b', 'c', 'd', 'e', 'f']
John Strickler
quelle
Ich habe auch eine Frage: myArray = []; myArray.push ({'text': 'irgendein Text', 'id': 13}); und jetzt ist myArray leer. Wenn wir also versuchen, den Wert von myArray [0] ['text'] abzurufen, ist er leer. Warum? take.ms/jSvbn
fdrv
Etwas scheint nicht zu stimmen. Stellen Sie sicher, dass kein Scoping-Problem vorliegt. Verwenden Sie let / var, um myArray zu deklarieren. Weil myArray.push immer myArray mutiert.
John Strickler
58
var years = [];
for (i= 2015;i<=2030;i=i+1)
{
years.push({operator : i})
}

Hier haben Array-Jahre Werte wie

years[0]={operator:2015}
years[1]={operator:2016}

es geht so weiter.

Santhosh
quelle
55

Erstens gibt es kein objectoder array. Es gibt Objectund Array. Zweitens können Sie das tun:

a = new Array();
b = new Object();
a[0] = b;

Jetzt awird ein Array mit bals einzigem Element sein.

Gabi Purcaru
quelle
4
+1 für die am wenigsten komplizierte Antwort. Ich habe es unten erweitert, um eine Antwort auf OPs Frage 2 aufzunehmen.
Sam
30

Mit der ES6Notation können Sie Folgendes tun:

Zum Anhängen können Sie den Spread-Operator wie folgt verwenden:

var arr1 = [1,2,3]
var obj = 4
var newData = [...arr1, obj] // [1,2,3,4]
console.log(newData);

Aayushi
quelle
20
  • Bei JavaScript wird zwischen Groß- und Kleinschreibung unterschieden . Calling new array()und new object()wird ein werfen, ReferenceErrorda sie nicht existieren.
  • Es ist besser zu vermeiden, new Array()da es fehleranfällig ist .
    Weisen Sie stattdessen das neue Array mit zu = [val1, val2, val_n]. Verwenden Sie für Objekte = {}.
  • Es gibt viele Möglichkeiten , wenn es um ein Array zu erstrecken kommt (wie in Johns gezeigt Antwort ) , aber der sicherste Weg wäre einfach zu verwenden , concatstatt push. concatGibt ein neues Array zurück und lässt das ursprüngliche Array unberührt. pushmutiert das aufrufende Array, was vermieden werden sollte , insbesondere wenn das Array global definiert ist.
  • Es ist auch eine gute Praxis, das Objekt sowie das neue Array einzufrieren , um unbeabsichtigte Mutationen zu vermeiden. Ein gefrorenes Objekt ist weder veränderlich noch erweiterbar (flach).

Wenn Sie diese Punkte anwenden und Ihre beiden Fragen beantworten, können Sie eine Funktion wie die folgende definieren:

function appendObjTo(thatArray, newObj) {
  const frozenObj = Object.freeze(newObj);
  return Object.freeze(thatArray.concat(frozenObj));
}

Verwendungszweck:

// Given
const myArray = ["A", "B"];
// "save it to a variable"
const newArray = appendObjTo(myArray, {hello: "world!"});
// returns: ["A", "B", {hello: "world!"}]. myArray did not change.
Boghyon Hoffmann
quelle
2
"Verwendung" machte dies zu meiner persönlichen bevorzugten Antwort.
HPWD
@ Boghyon, ich bin neugierig auf das Einfrieren und Mutationen. Sprechen Sie über Änderungen am Array, die direkt aufgrund der concat-Methode auftreten können, oder aufgrund von Änderungen, die möglicherweise an einer anderen Stelle im Skript am Array vorgenommen werden, während eine '.concat ()' ausgeführt wird? Wenn dies der zweite Fall ist, sollte dies nicht automatisch verhindert werden, da Javascript Single-Threaded ist, selbst im Fall von asynchronem Code, da die Steuerung zumindest theoretisch erst nach Abschluss der Methode zurückgegeben werden sollte?
jdmayfield
@jdmayfield: Die Evaluierungsstrategie von JS wird durch Objektfreigabe aufgerufen . Wenn Objekte herumgereicht werden, werden sie nicht kopiert. Die Mutationen in diesen Objekten sind für die Anrufer immer sofort sichtbar, unabhängig davon, ob der Mutator asynchron aufgerufen, abgeschlossen oder nicht aufgerufen wurde. Da solche Nebenwirkungen häufig zu Fehlern führten, geben wir ein neues Objekt zurück, das vom ursprünglichen Objekt entkoppelt ist. Die Objekte unveränderlich zu machen (z. B. via freeze) ist nur ein zusätzlicher Schritt, um unbeabsichtigte Mutationen zu verhindern.
Boghyon Hoffmann
@jdmayfield: Aber wie Sie vielleicht schon vermutet haben, kann das Erstellen neuer Objekte jedes Mal schnell ineffizient werden, wenn die Objekte riesig werden. Für solche Fälle gibt es hilfreiche Bibliotheken, die es effizient machen, indem sie persistente Datenstrukturen wie Mori (irgendwie tot) und Immutable.js nutzen . Hier ist eine kurze Einführung in "Warum Unveränderlichkeit": youtu.be/e-5obm1G_FY
Boghyon Hoffmann
9

Erweiterung der Antwort von Gabi Purcaru um eine Antwort auf Nummer 2.

a = new Array();
b = new Object();
a[0] = b;

var c = a[0]; // c is now the object we inserted into a...
Sam
quelle
8

/* array literal */
var aData = [];

/* object constructur */
function Data(firstname, lastname) {
  this.firstname = firstname;
  this.lastname = lastname;
  this.fullname = function() {
    return (this.firstname + " " + this.lastname);
  };
}

/* store object into array */
aData[aData.length] = new Data("Java", "Script"); // aData[0]

aData.push(new Data("Jhon", "Doe"));
aData.push(new Data("Anna", "Smith"));
aData.push(new Data("Black", "Pearl"));

aData[aData.length] = new Data("stack", "overflow"); // aData[4]

/* loop arrray */
for (var x in aData) {
  alert(aData[x].fullname());
}

/* convert array of object into string json */
var jsonString = JSON.stringify(aData);
document.write(jsonString);

Anteliebe
quelle
7

obejctist eindeutig ein Tippfehler. Aber beide objectund arraybrauchen Großbuchstaben.

Sie können kurze Hände für verwenden new Arrayund new Objectdiese sind []und{}

Sie können Daten mit in das Array übertragen .push. Dies fügt es am Ende des Arrays hinzu. oder Sie können einen Index festlegen, der die Daten enthält.

function saveToArray() {
    var o = {};
    o.foo = 42;
    var arr = [];
    arr.push(o);
    return arr;
}

function other() {
    var arr = saveToArray();
    alert(arr[0]);
}

other();
Raynos
quelle
5

Auf alternative Antwort ist dies.

Wenn Sie und Array wie folgt haben: var contacts = [bob, mary];

Wenn Sie ein anderes Array in dieses Array einfügen möchten, können Sie dies folgendermaßen tun:

Deklarieren Sie den Funktionskonstruktor

function add (firstName,lastName,email,phoneNumber) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.phoneNumber = phoneNumber;
}

Machen Sie das Objekt aus der Funktion:

var add1 = new add("Alba","Fas","[email protected]","[098] 654365364");

und fügen Sie das Objekt dem Array hinzu:

contacts[contacts.length] = add1;
Po Po
quelle
3
a=[];
a.push(['b','c','d','e','f']);
Harjinder singh
quelle
6
Hallo, willkommen bei SO. Bitte geben Sie den Code nicht einfach als Antwort aus. Erklären Sie Ihre Gedanken, damit Benutzer besser verstehen können, was los ist. Vielen Dank.
Cthulhu
2

So habe ich den Objektersteller mit der automatischen Liste erstellt:

var list = [];

function saveToArray(x) {
    list.push(x);
};

function newObject () {
    saveToArray(this);
};
Tadas Stundys
quelle
0

Wenn Sie Ihren Code als solchen verwenden, tritt ein Bereichsproblem auf. Sie müssen es außerhalb der Funktionen deklarieren, wenn Sie es zwischen ihnen verwenden möchten (oder wenn Sie es aufrufen, übergeben Sie es als Parameter).

var a = new Array();
var b = new Object();

function first() {
a.push(b);
// Alternatively, a[a.length] = b
// both methods work fine
}

function second() {
var c = a[0];
}

// code
first();
// more code
second();
// even more code
josh.trow
quelle