Jak dodać obiekt do tablicy


317

Jak mogę dodać obiekt do tablicy (w javascript lub jquery)? Na przykład, jaki jest problem z tym kodem?

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

Chciałbym użyć tego kodu do zapisania wielu obiektów w tablicy funkcji 1 i wywołać funkcję 2, aby użyć obiektu w tablicy.

  1. Jak mogę zapisać obiekt w tablicy?
  2. Jak mogę umieścić obiekt w tablicy i zapisać go w zmiennej?

12
Nie poprawiaj błędów w opublikowanym kodzie, podobnie jak w przypadku edycji 5. Jeśli skorygujesz prosty błąd w pytaniu, często nie ma powodu, aby odpowiedź istniała.
Paul,

Również pushbył już wielokrotnie sugerowany tutaj. Nie zanieczyszczaj tego wątku inną pushsugestią.
Boghyon Hoffmann

Odpowiedzi:


630

Umieść wszystko w tablicy za pomocą Array.push ().

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

Dodatkowe informacje na temat tablic

Dodaj więcej niż jeden element na raz

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

Dodaj elementy na początku tablicy

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

Dodaj zawartość jednej tablicy do drugiej

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)

Utwórz nową tablicę z zawartości dwóch tablic

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

Mam też pytanie: myArray = []; myArray.push ({'text': 'some text', 'id': 13}); a teraz myArray jest pusty. Więc jeśli spróbujemy uzyskać wartość z myArray [0] ['text'], będzie pusta, dlaczego? take.ms/jSvbn
fdrv

Coś wydaje się nie tak. Upewnij się, że nie występuje problem z zasięgiem. Użyj let / var, aby zadeklarować myArray. Ponieważ myArray.push zawsze mutuje myArray.
John Strickler,

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

tutaj tablica lat ma wartości takie jak

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

kontynuuje się tak.


55

Przede wszystkim nie ma objectlub array. Są Objecti Array. Po drugie, możesz to zrobić:

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

Teraz abędzie tablicą, bktórej jedynym elementem będzie.


4
+1 za najmniej skomplikowaną odpowiedź. Rozszerzyłem ją poniżej, aby uwzględnić odpowiedź na pytanie 2 OP
Sam


20
  • JavaScript rozróżnia małe i wielkie litery . Dzwoni new array()i new object()rzuci, ReferenceErrorponieważ nie istnieją.
  • Lepiej tego unikać new Array()ze względu na jego podatne na błędy zachowanie .
    Zamiast tego przypisz nową tablicę za pomocą = [val1, val2, val_n]. W przypadku obiektów użyj = {}.
  • Istnieje wiele sposobów rozszerzenia tablicy (jak pokazano w odpowiedzi Johna ), ale najbezpieczniejszym sposobem byłoby po prostu użycie concatzamiast push. concatzwraca nową tablicę, pozostawiając oryginalną tablicę nietkniętą. pushmutuje tablicę wywołującą, której należy unikać , zwłaszcza jeśli tablica jest zdefiniowana globalnie.
  • Dobrą praktyką jest również zamrażanie obiektu, a także nowej tablicy, aby uniknąć niezamierzonych mutacji. Zamrożony przedmiot nie jest ani zmienny, ani rozszerzalny (płytko).

Stosując te punkty i odpowiadając na dwa pytania, możesz zdefiniować funkcję taką jak ta:

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

Stosowanie:

// 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
„Użycie” sprawiło, że moja osobista preferowana odpowiedź.
HPWD

@boghyon, jestem ciekaw zamrożenia i mutacji. Czy mówisz o zmianach w tablicy, które mogą nastąpić bezpośrednio z powodu metody concat, lub z powodu zmian, które mogą zostać wprowadzone w tablicy z innego miejsca w skrypcie podczas wykonywania funkcji „.concat ()”? Jeśli po drugie, czy nie należy temu automatycznie zapobiegać z powodu jednowątkowego javascript, nawet w przypadku kodu asynchronicznego, ponieważ kontrola, przynajmniej teoretycznie, nie powinna być zwracana do czasu zakończenia metody?
jdmayfield

@jdmayfield: Strategią oceny JS jest wywołanie przez współdzielenie obiektów . Kiedy obiekty są przekazywane, nie są kopiowane. Mutacje w tych obiektach, gdy są przekazywane, są zawsze natychmiast widoczne dla dzwoniących, niezależnie od tego, czy mutator został wywołany asynchronicznie, zakończony, czy nie. Ponieważ takie skutki uboczne często prowadziły do ​​błędów, zwracamy nowy obiekt, oddzielony od oryginalnego. Uczynienie obiektów niezmiennymi (np. Via freeze) to tylko dodatkowy krok, aby zapobiec niezamierzonym mutacjom.
Boghyon Hoffmann

@jdmayfield: Ale jak już można się domyślać, tworzenie nowych obiektów za każdym razem może stać się nieefektywne, gdy obiekty stają się ogromne. W takich przypadkach dostępne są pomocne biblioteki lib, które zwiększają wydajność dzięki wykorzystaniu trwałych struktur danych, takich jak Mori (trochę martwy) i Immutable.js . Oto krótki wstęp do „dlaczego niezmienność”: youtu.be/e-5obm1G_FY
Boghyon Hoffmann

9

Rozszerzenie odpowiedzi Gabi Purcaru o odpowiedź na numer 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

obejctto wyraźnie literówka. Ale zarówno objecti arraylitery potrzeba.

Możesz użyć krótkich rąk, new Arraya new Objectsą to []i{}

Możesz wcisnąć dane do tablicy za pomocą .push. Dodaje to do końca tablicy. lub możesz ustawić indeks, aby zawierał dane.

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

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

other();

5

Na alternatywną odpowiedź brzmi:

jeśli masz taką tablicę: var contacts = [bob, mary];

i chcesz umieścić w tej tablicy kolejną tablicę, możesz to zrobić w następujący sposób:

Zadeklaruj konstruktor funkcji

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

uczyń obiekt z funkcji:

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

i dodaj obiekt do tablicy:

contacts[contacts.length] = add1;

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

6
Cześć, witamy w SO. Proszę nie tylko zrzucić kod jako odpowiedź. Wyjaśnij swoje przemyślenia, aby użytkownicy mogli lepiej zrozumieć, co się dzieje. Dzięki.
Cthulhu,

2

Sposób, w jaki stworzyłem obiekt do tworzenia obiektów z listą automatyczną:

var list = [];

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

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

0

Jeśli używasz swojego kodu jako takiego, napotykasz problem z zakresem. Musisz zadeklarować go poza funkcjami, jeśli planujesz używać go między nimi (lub jeśli wywołujesz, przekaż go jako parametr).

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.