Como adicionar um objeto a uma matriz

317

Como posso adicionar um objeto a uma matriz (em javascript ou jquery)? Por exemplo, qual é o problema com este código?

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

Eu gostaria de usar esse código para salvar muitos objetos na matriz da função1 e chamar a função2 para usar o objeto na matriz.

  1. Como posso salvar um objeto em uma matriz?
  2. Como posso colocar um objeto em uma matriz e salvá-lo em uma variável?
mais naser
fonte
12
Por favor, não corrija erros no código publicado, como a edição 5 fez. Se você corrigir um erro simples na pergunta, geralmente não há razão para a resposta existir.
Paul
Além disso, pushjá foi sugerido várias vezes aqui. Por favor, não polua mais este tópico com outra pushsugestão.
Boghyon Hoffmann

Respostas:

631

Coloque qualquer coisa em uma matriz usando Array.push ().

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

Informações extras sobre matrizes

Adicione mais de um item por vez

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

Adicionar itens ao início de uma matriz

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

Adicione o conteúdo de uma matriz a outra

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)

Crie uma nova matriz a partir do conteúdo de duas matrizes

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
fonte
Eu também tenho uma pergunta: myArray = []; myArray.push ({'text': 'algum texto', 'id': 13}); e agora o myArray está vazio. Portanto, se tentarmos obter o valor de myArray [0] ['text'], ele ficará vazio, por quê? take.ms/jSvbn
fdrv
Algo não parece certo. Verifique se não há um problema de escopo. Use let / var para declarar myArray. Porque myArray.push sempre mudará myArray.
John Strickler
58
var years = [];
for (i= 2015;i<=2030;i=i+1)
{
years.push({operator : i})
}

aqui anos matriz está tendo valores como

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

continua assim.

santhosh
fonte
55

Primeiro de tudo, não há objectou array. Existem Objecte Array. Em segundo lugar, você pode fazer isso:

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

Agora aserá uma matriz com bseu único elemento.

Gabi Purcaru
fonte
4
+1 para a resposta menos complicada demais. Eu expandiu abaixo para incluir uma resposta à pergunta de OP 2.
Sam
30

Usando a ES6notação, você pode fazer algo assim:

Para anexar, você pode usar o operador de spread assim:

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

Aayushi
fonte
20
  • JavaScript diferencia maiúsculas de minúsculas . Chamando new array()e new object()lançará umReferenceError pois eles não existem.
  • É melhor evitar new Array()devido ao seu comportamento propenso a erros .
    Em vez disso, atribua a nova matriz com = [val1, val2, val_n]. Para objetos, use = {}.
  • Existem várias maneiras de estender uma matriz (como mostrado em John resposta ), mas a maneira mais segura seria apenas usar em concatvez de push. concatretorna uma nova matriz, deixando a matriz original intocada. pushmodifica a matriz de chamada que deve ser evitada , especialmente se a matriz for definida globalmente.
  • Também é uma boa prática congelar o objeto, bem como a nova matriz, para evitar mutações não intencionais. Um objeto congelado não é mutável nem extensível (superficialmente).

Aplicando esses pontos e para responder às suas duas perguntas, você pode definir uma função 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
fonte
2
"Uso" é o que fez dessa minha resposta preferida pessoal.
HPWD 03/10/19
@ Boghyon, estou curioso sobre o congelamento e mutações. Você está falando sobre alterações na matriz que podem ocorrer diretamente por causa do método concat ou devido a alterações que podem ser feitas na matriz de outras partes do script durante o processo de execução de um '.concat ()'? Se o segundo, isso não deveria ser evitado automaticamente devido ao javascript ser thread único, mesmo no caso de código assíncrono, já que o controle, pelo menos teoricamente, não deve ser retornado até que o método seja concluído?
Jdmayfield 01/02/19
@jdmayfield: a estratégia de avaliação do JS é chamada pelo compartilhamento de objetos . Quando objetos são passados, eles não são copiados. As mutações nesses objetos, enquanto são transmitidas, são sempre visíveis imediatamente para os chamadores, independentemente de o mutador ter sido chamado de forma assíncrona, concluída ou não. Como esses efeitos colaterais geralmente levam a erros, estamos retornando um novo objeto, dissociado do original. Tornar os objetos imutáveis ​​(por exemplo, via freeze) é apenas uma etapa adicional para evitar mutações não intencionais.
Boghyon Hoffmann
@jdmayfield: Mas como você já deve ter adivinhado, criar novos objetos toda vez pode se tornar ineficiente rapidamente quando os objetos ficam enormes. Para esses casos, existem bibliotecas úteis, que a tornam eficiente ao alavancar estruturas de dados persistentes, como Mori (meio morto) e Immutable.js . Aqui está uma breve introdução ao "porquê imutabilidade": youtu.be/e-5obm1G_FY
Boghyon Hoffmann
9

Expandir a resposta de Gabi Purcaru para incluir uma resposta ao 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
fonte
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);

antelove
fonte
7

obejcté claramente um erro de digitação. Mas ambos objectearray precisam de letras maiúsculas.

Você pode usar mãos curtas new Arraye new Objectestas são[] e{}

Você pode enviar dados para a matriz usando .push. Isso o adiciona ao final da matriz. ou você pode definir um índice para conter os dados.

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

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

other();
Raynos
fonte
5

Em resposta alternativa é esta.

se você tiver um array como este: var contacts = [bob, mary];

e você deseja colocar outra matriz nessa matriz, você pode fazer isso desta maneira:

Declare o construtor da função

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

faça o objeto da função:

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

e adicione o objeto à matriz:

contacts[contacts.length] = add1;
Po Po
fonte
3
a=[];
a.push(['b','c','d','e','f']);
harjinder singh
fonte
6
Olá, bem-vindo ao SO. Por favor, não apenas despeje o código como resposta. Explique seus pensamentos para que os usuários possam entender melhor o que está acontecendo. Obrigado.
Cthulhu
2

A maneira como criei o criador de objetos com a lista automática:

var list = [];

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

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

Você está tendo um problema de escopo se usar seu código como tal. Você deve declará-lo fora das funções se planeja usá-lo entre eles (ou, se estiver chamando, passe-o 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
fonte