Cómo agregar un objeto a una matriz

317

¿Cómo puedo agregar un objeto a una matriz (en javascript o jquery)? Por ejemplo, ¿cuál es el problema con este código?

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

Me gustaría usar este código para guardar muchos objetos en la matriz de function1 y llamar a function2 para usar el objeto en la matriz.

  1. ¿Cómo puedo guardar un objeto en una matriz?
  2. ¿Cómo puedo poner un objeto en una matriz y guardarlo en una variable?
más desagradable
fuente
12
No corrija los errores en el código publicado, como lo hizo la edición 5. Si corrige un error simple en la pregunta, a menudo no hay razón para que exista la respuesta.
Paul
Además, ya pushse ha sugerido varias veces aquí. Por favor, no contamines más este hilo con otra pushsugerencia.
Boghyon Hoffmann

Respuestas:

631

Ponga cualquier cosa en una matriz usando Array.push ().

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

Información adicional sobre matrices

Agregue más de un artículo a la vez

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

Agregar elementos al comienzo de una matriz

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

Agregar el contenido de una matriz a otra

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)

Crear una nueva matriz a partir del contenido de dos matrices.

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
fuente
También tengo una pregunta: myArray = []; myArray.push ({'text': 'some text', 'id': 13}); y ahora myArray está vacío. Entonces, si intentamos obtener el valor de myArray [0] ['text'] estará vacío, ¿por qué? take.ms/jSvbn
fdrv
Algo no parece correcto. Asegúrese de que no haya un problema de alcance. Use let / var para declarar myArray. Porque myArray.push siempre mutará myArray.
John Strickler
58
var years = [];
for (i= 2015;i<=2030;i=i+1)
{
years.push({operator : i})
}

aquí años matriz está teniendo valores como

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

continúa así.

santhosh
fuente
55

En primer lugar, no hay objecto array. Hay Objecty Array. En segundo lugar, se puede hacer lo siguiente:

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

Ahora aserá una matriz con bcomo único elemento.

Gabi Purcaru
fuente
44
+1 para la respuesta menos complicada. Lo he expandido a continuación para incluir una respuesta a la pregunta 2 de OP.
Sam
30

Usando la ES6notación, puedes hacer algo como esto:

Para agregar puede usar el operador de propagación de esta manera:

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

Aayushi
fuente
20
  • JavaScript distingue entre mayúsculas y minúsculas . Llamando new array()y new object()lanzará un ReferenceErrorya que no existen.
  • Es mejor evitarlo new Array()debido a su comportamiento propenso a errores .
    En su lugar, asigne la nueva matriz con = [val1, val2, val_n]. Para objetos, use = {}.
  • Hay muchas maneras de extender una matriz (como se muestra en la respuesta de John ), pero la forma más segura sería usarla en concatlugar de hacerlo push. concatdevuelve una nueva matriz, dejando intacta la matriz original. pushmuta la matriz de llamada que debe evitarse , especialmente si la matriz está definida globalmente.
  • También es una buena práctica congelar el objeto y la nueva matriz para evitar mutaciones no deseadas. Un objeto congelado no es mutable ni extensible (superficialmente).

Aplicando esos puntos y para responder sus dos preguntas, podría definir una función como esta:

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.
Boghyon Hoffmann
fuente
2
El "uso" es lo que hizo de esta mi respuesta preferida personal.
HPWD
@boghyon, tengo curiosidad por la congelación y las mutaciones. ¿Está hablando de cambios en la matriz que podrían ocurrir directamente debido al método concat, o debido a los cambios que podrían realizarse en la matriz desde otra parte del script durante el proceso de realizar un '.concat ()'? Si es el segundo, ¿no debería evitarse esto automáticamente debido a que javascript tiene un solo subproceso, incluso en el caso de código asincrónico ya que el control, al menos en teoría, no se devolverá hasta que se complete el método?
jdmayfield
@jdmayfield: la estrategia de evaluación de JS se llama compartiendo objetos . Cuando se pasan objetos, no se copian. Las mutaciones en esos objetos, mientras se transmiten, siempre son visibles de inmediato para las personas que llaman, independientemente de si el mutador fue llamado asincrónicamente, completado o no. Dado que tales efectos secundarios a menudo conducen a errores, estamos devolviendo un nuevo objeto, desacoplado del original. Hacer que los objetos sean inmutables (por ejemplo, vía freeze) es solo un paso adicional para evitar mutaciones no deseadas.
Boghyon Hoffmann
@jdmayfield: Pero como ya habrás adivinado, crear nuevos objetos cada vez puede volverse ineficiente rápidamente cuando los objetos se vuelven enormes. Para tales casos, existen libs útiles, que lo hacen eficiente al aprovechar las estructuras de datos persistentes, como Mori (un poco muerto) e Immutable.js . Aquí hay una breve introducción a "por qué la inmutabilidad": youtu.be/e-5obm1G_FY
Boghyon Hoffmann
9

Ampliando la respuesta de Gabi Purcaru para incluir una respuesta al número 2.

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

var c = a[0]; // c is now the object we inserted into a...
Sam
fuente
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);

antílope
fuente
7

obejctEs claramente un error tipográfico. Pero ambos objectyarray necesitan mayúsculas.

Puedes usar manos cortas para new Arrayy new Objectestas son []y{}

Puede insertar datos en la matriz usando .push. Esto lo agrega al final de la matriz. o puede establecer un índice para contener los datos.

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

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

other();
Raynos
fuente
5

En alternativa la respuesta es esta.

si tiene una matriz como esta: var contacts = [bob, mary];

y desea colocar otra matriz en esta matriz, puede hacerlo de esta manera:

Declarar el constructor de la función.

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

hacer el objeto desde la función:

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

y agregue el objeto a la matriz:

contacts[contacts.length] = add1;
Po Po
fuente
3
a=[];
a.push(['b','c','d','e','f']);
Harjinder Singh
fuente
66
Hola, bienvenido a SO. Por favor, no solo descargue el código como respuesta. Explica tus pensamientos para que los usuarios puedan entender mejor lo que está sucediendo. Gracias.
Cthulhu
2

La forma en que hice el creador de objetos con la lista automática:

var list = [];

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

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

Se encuentra con un problema de alcance si usa su código como tal. Debe declararlo fuera de las funciones si planea usarlo entre ellas (o si está llamando, páselo como parámetro).

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
fuente