2009-03-05 20 views
110

Mam obiekt, który posiada alarmy i informacje o nich:Dołączanie do obiektu

var alerts = { 
    1: {app:'helloworld','message'}, 
    2: {app:'helloagain',message:'another message'} 
} 

Poza tym, mam zmienną, która mówi ile alarmy istnieją alertNo. Moje pytanie brzmi: kiedy dodam nowy alert, czy istnieje sposób dołączenia alertu do obiektu alerts?

+5

myślę, że masz problem ze swoim dydaktyczna json: 1: {app: 'helloworld', 'wiadomość'} = > 1: {aplikacja: "helloworld", wiadomość: "wiadomość"}? –

Odpowiedz

189

Co z przechowywaniem alertów jako rekordów w tablicy zamiast właściwości pojedynczego obiektu?

var alerts = [ 
    {num : 1, app:'helloworld',message:'message'}, 
    {num : 2, app:'helloagain',message:'another message'} 
] 

A następnie dodać jedną, wystarczy użyć push:

alerts.push({num : 3, app:'helloagain_again',message:'yet another message'}); 
2

Czy masz możliwość zmiany najbardziej zewnętrznej struktury do tablicy? Tak to będzie wyglądać ten

var alerts = [{"app":"helloworld","message":null},{"app":"helloagain","message":"another message"}]; 

więc kiedy trzeba było dodać jeden, można po prostu wcisnąć go na tablicy

alerts.push({"app":"goodbyeworld","message":"cya"}); 

Wtedy masz wbudowany indeksu od zera do jak błędy są wymienione.

3

Należy naprawdę iść z tablicy wpisów sugestie, ale poza tym dodanie do obiektu, o którym mowa będzie wyglądać następująco:

alerts[3]={"app":"goodbyeworld","message":"cya"}; 

Ale ponieważ nie należy używać jako nazwy numerów dosłowne cytowanie wszystko i iść z

alerts['3']={"app":"goodbyeworld","message":"cya"}; 

lub możesz zrobić z niego tablicę obiektów.

Dostęp wygląda

alerts['1'].app 
=> "helloworld" 
-1

Spróbuj tego:

alerts.splice(0,0,{"app":"goodbyeworld","message":"cya"}); 

działa całkiem dobrze, to dodamy go do początku tablicy.

+0

To nie działa, ponieważ nie mogę wywołać splice na obiekcie, tylko w tablicy. –

53

jQuery $.extend(obj1, obj2) połączy 2 obiekty dla ciebie, ale powinieneś naprawdę używać tablicy.

var alertsObj = { 
    1: {app:'helloworld','message'}, 
    2: {app:'helloagain',message:'another message'} 
}; 

var alertArr = [ 
    {app:'helloworld','message'}, 
    {app:'helloagain',message:'another message'} 
]; 

var newAlert = {app:'new',message:'message'}; 

$.extend(alertsObj, newAlert); 
alertArr.push(newAlert); 
+0

Rozszerzenie JQuery jest powolne: http://trevmex.com/post/2531629773/jquerys-extend-is-slow.Ponadto występuje literówka. $ .extends() powinno odczytać $ .extend(). – ken

+0

Dobry połów z literówką. Są sytuacje, w których $ .extends jest pomocne, ale masz rację, że powinno się go unikać, kiedy to możliwe. – respectTheCode

+1

Myślę, że extend() jest ok, gdy masz tylko jedną strukturę rekordu, bez nawiasów, dla reszty Zgadzam się z respectTheCode, wystarczy użyć push() – elvenbyte

-2
alerts.unshift({"app":"goodbyeworld","message":"cya"}); 
+0

Byłoby to wykonalne, gdyby alerty były tablicą, a nie obiektem. – tfantina

0

Podobnie jak inne odpowiedzi wskazał, może się okazać, że łatwiej pracować z szerokim wachlarzem.

Jeśli nie:

var alerts = { 
    1: {app:'helloworld',message:'message'}, 
    2: {app:'helloagain',message:'another message'} 
} 

// Get the current size of the object 
size = Object.keys(alerts).length 

//add a new alert 
alerts[size + 1] = {app:'Your new app', message:'your new message'} 

//Result: 
console.log(alerts) 
{ 
    1: {app:'helloworld',message:'message'}, 
    2: {app:'helloagain',message:'another message'} 
    3: {app: "Another hello",message: "Another message"} 
}  

spróbować:

https://jsbin.com/yogimo/edit?js,console

Powiązane problemy