Dołączanie do obiektu


156

Mam obiekt, który przechowuje alerty i kilka informacji o nich:

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

Poza tym, mam zmienną, która mówi ile alarmy istnieją alertNo. Moje pytanie brzmi: czy kiedy idę dodać nowy alert, istnieje sposób, aby dołączyć alert do alertsobiektu?


6
Myślę, że masz problem z opublikowanym plikiem json: 1: {app: 'helloworld', 'message'} => 1: {app: 'helloworld', message: 'a message'}?
Andreas Grech,

Odpowiedzi:


235

Co powiesz na przechowywanie 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, aby dodać, po prostu użyj push:

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

1
Ta odpowiedź wymaga, abyś znał identyfikator wpisu, który ma zostać dodany. Dobrze, jeśli już wiesz, że to można po prostu śledzić oryginalny format obiektu i zrobić: alerts[3] = { app: 'hello3', message: 'message 3' }. Dzięki temu można uzyskać dostęp do wiadomości przez ID: alerts[2] => { app: 'helloworld', message: 'message' }. Uzyskanie długości jest wtedy po prostu: Object.keys(alerts).length(ten bit jest łatwiejszy w przypadku tablic)
Matt

61

jQuery $.extend(obj1, obj2)połączyłby dla ciebie 2 obiekty, ale naprawdę powinieneś 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);

Rozszerzenie JQuery jest powolne: trevmex.com/post/2531629773/jquerys-extend-is-slow . Jest też literówka. $ .extends () powinno czytać $ .extend ().
ken

Dobry chwyt z literówką. Są sytuacje, w których $ .extends jest pomocne, ale masz rację, że należy go unikać, gdy jest to możliwe.
respekt TheCode,

1
Myślę, że rozszerzenie () jest w porządku, gdy masz tylko jedną strukturę rekordu, bez nawiasów, dla reszty zgadzam się z respektem TheCode, po prostu użyj push ()
elvenbyte

39

Możesz to zrobić za pomocą Object. assign () . Czasami potrzebujesz tablicy, ale podczas pracy z funkcjami, które oczekują pojedynczego obiektu JSON - na przykład wywołania OData - ta metoda jest prostsza niż tworzenie tablicy tylko w celu jej rozpakowania.

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

alerts = Object.assign({3: {app:'helloagain_again',message:'yet another message'}}, alerts)

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

EDYCJA: Aby odnieść się do komentarza dotyczącego uzyskania następnego klucza, możesz uzyskać tablicę kluczy za pomocą funkcji Object.keys () - zobacz odpowiedź Vadi, aby zapoznać się z przykładem zwiększania klucza. Podobnie możesz uzyskać wszystkie wartości za pomocą Object.values ​​() i par klucz-wartość za pomocą Object.entries () .

var alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
}
console.log(Object.keys(alerts))
// Output
Array [ "1", "2" ]

7
W rzeczywistości jest to poprawna odpowiedź, ponieważ inni odnoszą się do przekształcania obiektu w tablicę, ale w ten sposób zachowujesz go jako obiekt. W przypadku autora możliwe, że lepiej byłoby dla niego pracować z tablicami, ale to byłaby odpowiedź na pytanie, jak dołączyć do obiektu.
Goran Jakovljevic

2
tak, zgadzam się ... W pytaniu nie ma tablicy obiektów, to tylko obiekt, więc to jest doskonała odpowiedź!
Kishan Oza

To jest jednak właściwa odpowiedź; skąd możesz wiedzieć, który indeks zamierzasz dodać nowy obiekt?
Capan

1
oto odpowiedź na tytułowe pytanie.
FistOfFury

11

Podobnie jak w przypadku innych odpowiedzi, praca z tablicą może być łatwiejsza.

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óbuj:

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


To nie zadziała, jeśli usunąłeś alerty lub pominąłeś klucz. Powinieneś dodać coś w stylu while(alerts[size]) size++;I prawdopodobnie zmień nazwę sizena newId.
Do

11

Możesz użyć składni rozkładania w następujący sposób.

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

alerts = {...alerts, 3: {app: 'hey there', message: 'another message'} }

7

Teraz w ES6 mamy bardzo potężnego operatora rozprzestrzeniania (... Obiekt), który może bardzo ułatwić tę pracę. Można to zrobić w następujący sposób:

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

//now suppose you want to add another key called alertNo. with value 2 in the alerts object. 

alerts = {
   ...alerts,
   alertNo: 2
 }

Otóż ​​to. Doda wybrany klucz. Mam nadzieję że to pomoże!!


6

Naprawdę powinieneś skorzystać z tablicy sugestii dotyczących alertów, ale w przeciwnym razie dodanie do wspomnianego obiektu wyglądałoby tak:

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

Ale ponieważ nie powinieneś używać dosłownych liczb, ponieważ nazwy cytują wszystko i idą z nimi

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

lub możesz uczynić z niej tablicę obiektów.

Jak to wygląda

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

5

Czy masz możliwość zmiany najbardziej zewnętrznej struktury na tablicę? Więc to by wyglądało tak

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

Więc kiedy trzeba było dodać jeden, możesz po prostu włożyć go do tablicy

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

Następnie masz wbudowany indeks liczony od zera dla sposobu wyliczania błędów.


2

O wiele łatwiej z ES6:

let exampleObj = {
  arg1: {
    subArg1: 1,
    subArg2: 2,
  },
  arg2: {
    subArg1: 1,
    subArg2: 2,
  }
};

exampleObj.arg3 = {
  subArg1: 1,
  subArg2: 2,
};

console.log(exampleObj);

{
arg1: {subArg1: 1, subArg2: 2}
arg2: {subArg1: 1, subArg2: 2}
arg3: {subArg1: 1, subArg2: 2}
}

0

Alternatywnie w ES6 można użyć składni rozpraszania. ${Object.keys(alerts).length + 1}wraca jako następny iddla alarmu.

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

alerts = {
  ...alerts, 
  [`${Object.keys(alerts).length + 1}`]: 
  { 
    app: `helloagain${Object.keys(alerts).length + 1}`,message: 'next message' 
  } 
};

console.log(alerts);


0

Przepraszam, ale nie mogę komentować twoich odpowiedzi już z powodu mojej reputacji! ... więc jeśli chcesz zmodyfikować strukturę swojego obiektu, musisz zrobić tak , jak mówi Thane Plummer, ale mała sztuczka, jeśli nie obchodzi cię gdzie umieścić element: zostanie wstawiony na pierwszym miejscu, jeśli nie określisz numeru wstawienia.

Jest to wspaniałe, jeśli chcesz przekazać obiekt Json na przykład do wywołania funkcji mongoDB i wstawić nowy klucz w otrzymane warunki. W tym przypadku wstawię element myUid z pewnymi informacjami ze zmiennej wewnątrz mojego kodu:

// From backend or anywhere
let myUid = { _id: 'userid128344'};
// ..
// ..

  let myrequest = { _id: '5d8c94a9f629620ea54ccaea'};
  const answer = findWithUid( myrequest).exec();

// ..
// ..

function findWithUid( conditions) {
  const cond_uid = Object.assign({uid: myUid}, conditions);
  // the object cond_uid now is:
  // {uid: 'userid128344', _id: '5d8c94a9f629620ea54ccaea'}
  // so you can pass the new object Json completly with the new key
  return myModel.find(cond_uid).exec();
}


0

[Javascript] Po kilku drobiazgach, to zadziałało:

 let dateEvents = (
            {
                'Count': 2,
                'Items': [
                    {
                        'LastPostedDateTime': {
                            "S": "10/16/2019 11:04:59"
                        }
                    },
                    {
                        'LastPostedDateTime': {
                            "S": "10/30/2019 21:41:39"
                        }
                    }
                ],
            }
        );
        console.log('dateEvents', dateEvents);

Problem, który musiałem rozwiązać, polegał na tym, że mogę mieć dowolną liczbę wydarzeń i wszystkie miałyby tę samą nazwę: LastPostedDateTime, różni się tylko data i godzina.


-1

Spróbuj tego:

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

Działa całkiem nieźle, doda go na początek tablicy.


To nie zadziałało, ponieważ nie mogę wywołać splice na obiekcie, tylko na tablicy.
Richard Woolf,
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.