Come aggiungere un oggetto a un array


317

Come posso aggiungere un oggetto a un array (in javascript o jquery)? Ad esempio, qual è il problema con questo codice?

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

Vorrei usare questo codice per salvare molti oggetti nella matrice di function1 e chiamare function2 per usare l'oggetto nella matrice.

  1. Come posso salvare un oggetto in un array?
  2. Come posso mettere un oggetto in un array e salvarlo in una variabile?

12
Non correggere gli errori nel codice pubblicato, come ha fatto la modifica 5. Se si corregge un semplice errore nella domanda, spesso non esiste alcun motivo per cui esiste la risposta.
Paul,

Inoltre, pushè già stato suggerito più volte qui. Per favore, non inquinare più questa discussione con un altro pushsuggerimento.
Boghyon Hoffmann,

Risposte:


631

Inserisci qualsiasi cosa in un array usando Array.push ().

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

Ulteriori informazioni sugli array

Aggiungi più di un elemento alla volta

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

Aggiungi elementi all'inizio di un array

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

Aggiungi il contenuto di un array a un altro

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)

Creare un nuovo array dal contenuto di due array

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']

Ho anche una domanda: myArray = []; myArray.push ({'text': 'some text', 'id': 13}); e ora myArray è vuoto. Quindi se proviamo a ottenere il valore da myArray [0] ['text'] sarà vuoto, perché? take.ms/jSvbn
fdrv

Qualcosa non sembra giusto. Assicurarsi che non vi siano problemi di scoping. Usa let / var per dichiarare myArray. Perché myArray.push muterà sempre myArray.
John Strickler,

58
var years = [];
for (i= 2015;i<=2030;i=i+1)
{
years.push({operator : i})
}

qui gli anni della matrice stanno avendo valori come

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

continua così.


55

Prima di tutto, non c'è objecto array. Ci sono Objecte Array. In secondo luogo, puoi farlo:

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

Ora asarà un array con bcome unico elemento.


4
+1 per la risposta meno complicata. L'ho ampliato di seguito per includere una risposta alla domanda 2. OP
Sam

30

Usando la ES6notazione, puoi fare qualcosa del genere:

Per aggiungere è possibile utilizzare l' operatore di diffusione in questo modo:

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


20
  • JavaScript fa distinzione tra maiuscole e minuscole . Chiamando new array()e new object()lancerà un ReferenceErrorpoiché non esistono.
  • È meglio evitare a new Array()causa del suo comportamento soggetto a errori .
    Invece, assegnare il nuovo array con = [val1, val2, val_n]. Per gli oggetti, utilizzare= {} .
  • Ci sono molti modi quando si tratta di estendere un array (come mostrato nella risposta di John ) ma il modo più sicuro sarebbe solo quello di usarlo concatinvece di push. concatrestituisce un nuovo array, lasciando intatto l'array originale. pushmuta l'array chiamante che dovrebbe essere evitato , specialmente se l'array è definito globalmente.
  • È anche buona norma congelare l'oggetto e il nuovo array per evitare mutazioni indesiderate. Un oggetto congelato non è né mutabile né estensibile (superficialmente).

Applicando questi punti e per rispondere alle tue due domande, potresti definire una funzione come questa:

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

Uso:

// 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.

2
"Utilizzo" è ciò che ha reso questa la mia risposta preferita personale.
HPWD,

@boghyon, sono curioso del congelamento e delle mutazioni. Stai parlando di modifiche all'array che potrebbero verificarsi direttamente a causa del metodo concat o delle modifiche che potrebbero essere apportate all'array da un'altra parte dello script durante il processo di esecuzione di un '.concat ()'? Se il secondo, questo non dovrebbe essere automaticamente impedito a causa del javascript a thread singolo, anche nel caso di codice asincrono poiché il controllo non dovrebbe, almeno teoricamente, essere restituito fino al completamento del metodo?
jdmayfield,

@jdmayfield: la strategia di valutazione di JS è la chiamata mediante condivisione degli oggetti . Quando gli oggetti vengono fatti passare, non vengono copiati. Le mutazioni in quegli oggetti, pur essendo passate in giro, sono sempre immediatamente visibili ai chiamanti, indipendentemente dal fatto che il mutatore sia stato chiamato in modo asincrono, completato o meno. Poiché tali effetti collaterali hanno spesso portato a bug, stiamo restituendo un nuovo oggetto, disaccoppiato da quello originale. Rendere gli oggetti immutabili (ad es. Via freeze) è solo un passaggio aggiuntivo per prevenire mutazioni indesiderate.
Boghyon Hoffmann,

@jdmayfield: Ma come avrai già intuito, la creazione di nuovi oggetti ogni volta potrebbe diventare inefficiente rapidamente quando gli oggetti diventano enormi. Per questi casi, ci sono lib lib utili, che lo rendono efficiente sfruttando strutture di dati persistenti, come Mori (kinda dead) e Immutable.js . Ecco una breve introduzione al "perché l'immutabilità": youtu.be/e-5obm1G_FY
Boghyon Hoffmann,

9

Espandendo la risposta di Gabi Purcaru per includere una risposta al numero 2.

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

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

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);


7

obejctè chiaramente un errore di battitura. Ma entrambi objecte hanno arraybisogno di lettere maiuscole.

Puoi usare le mani corte per new Arraye new Objectquesti sono []e{}

È possibile inviare i dati nell'array utilizzando .push . Questo lo aggiunge alla fine dell'array. oppure puoi impostare un indice per contenere i dati.

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

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

other();

5

In alternativa la risposta è questa.

se hai e array in questo modo: var contacts = [bob, mary];

e vuoi mettere un altro array in questo array, puoi farlo in questo modo:

Dichiarare il costruttore della funzione

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

crea l'oggetto dalla funzione:

var add1 = new add("Alba","Fas","Des@gmail.com","[098] 654365364");

e aggiungi l'oggetto all'array:

contacts[contacts.length] = add1;

3
a=[];
a.push(['b','c','d','e','f']);

6
Ciao, benvenuto in SO. Per favore, non solo scaricare il codice come risposta. Spiega i tuoi pensieri in modo che gli utenti possano capire meglio cosa sta succedendo. Grazie.
Cthulhu,

2

Il modo in cui ho creato il creatore di oggetti con la lista automatica:

var list = [];

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

function newObject () {
    saveToArray(this);
};

0

Si riscontra un problema con l'ambito se si utilizza il codice in quanto tale. Devi dichiararlo al di fuori delle funzioni se prevedi di usarlo tra di loro (o se chiamalo, passalo come parametro).

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.