Aggiunta a un oggetto


156

Ho un oggetto che contiene avvisi e alcune informazioni su di essi:

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

In aggiunta a questo, ho una variabile che dice il numero di avvisi ci sono, alertNo. La mia domanda è: quando vado ad aggiungere un nuovo avviso, c'è un modo per aggiungere l'avviso alertssull'oggetto?


6
Penso che tu abbia un problema con il tuo json pubblicato: 1: {app: 'helloworld', 'message'} => 1: {app: 'helloworld', messaggio: 'un messaggio'}?
Andreas Grech,

Risposte:


235

Che ne dite di memorizzare gli avvisi come record in un array anziché come proprietà di un singolo oggetto?

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

E poi per aggiungerne uno, basta usare push:

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

1
Questa risposta si aspetta che tu sappia l'ID dell'avviso da aggiungere. Beh, se sai già che, allora si può semplicemente seguire il formato oggetto originale e fare: alerts[3] = { app: 'hello3', message: 'message 3' }. Con questo si può accedere ad un messaggio da ID: alerts[2] => { app: 'helloworld', message: 'message' }. Ottenere la lunghezza è quindi solo: Object.keys(alerts).length(quel bit è più facile con le matrici)
Matt

61

jQuery $.extend(obj1, obj2)unirebbe 2 oggetti per te, ma dovresti davvero usare un array.

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);

L'estensione di JQuery è lenta: trevmex.com/post/2531629773/jquerys-extend-is-slow . Inoltre, c'è un refuso. $ .extends () dovrebbe leggere $ .extend ().
Ken

Buona cattura con l'errore di battitura. Ci sono situazioni in cui $ .extends è utile ma hai ragione che dovrebbe essere evitato quando possibile.
rispettare Il codice

1
Penso che estende () sia ok quando hai solo una struttura record, senza parentesi, per il resto sono d'accordo con rispetto TheCode, basta usare push ()
elvenbyte

39

Puoi farlo con Object.assign () . A volte è necessario un array, ma quando si lavora con funzioni che prevedono un singolo oggetto JSON - come una chiamata OData - ho trovato questo metodo più semplice della creazione di un array solo per decomprimerlo.

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"}
} 

EDIT: per rispondere al commento relativo all'ottenimento della chiave successiva, puoi ottenere un array di chiavi con la funzione Object.keys () - vedi la risposta di Vadi per un esempio di incremento della chiave. Allo stesso modo, puoi ottenere tutti i valori con Object.values ​​() e le coppie chiave-valore con 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
Questa è in realtà la risposta corretta in quanto gli altri si riferiscono alla trasformazione dell'oggetto in array, ma in questo modo lo mantieni come oggetto. Nel caso dell'autore, è possibile che fosse meglio per lui lavorare con le matrici, ma questa sarebbe la risposta su come aggiungere ad un oggetto.
Goran Jakovljevic,

2
sì, sono d'accordo .. In questione non esiste un array di oggetti, è solo un oggetto, quindi questa è la risposta perfetta!
Kishan Oza,

Questa è la risposta corretta però; come fai a sapere quale indice vuoi aggiungere un nuovo oggetto?
Capan,

1
questa è la risposta alla domanda sul titolo.
FistOfFury,

11

Come sottolineato da altre risposte, potresti trovare più facile lavorare con un array.

Altrimenti:

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"}
}      

Provalo:

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


Questo non funzionerà se hai eliminato gli avvisi o hai saltato una chiave. Si dovrebbe aggiungere qualcosa sulla falsariga di while(alerts[size]) size++;E probabilmente rinominare sizea newId.
Fino al

11

È possibile utilizzare la sintassi di diffusione come segue.

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

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

7

Ora con ES6 abbiamo un operatore di diffusione molto potente (... Object) che può rendere questo lavoro molto semplice. Può essere fatto come segue:

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
 }

Questo è tutto. Aggiungerà la chiave desiderata. Spero che questo ti aiuti!!


6

Dovresti davvero andare con la serie di suggerimenti di avvisi, ma altrimenti aggiungere all'oggetto che hai citato sarebbe simile a questo:

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

Ma dal momento che non dovresti usare numeri letterali come nomi citano tutto e vai avanti

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

oppure puoi renderlo un array di oggetti.

Accedendo sembra

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

5

Hai la possibilità di cambiare la struttura più esterna in un array? Quindi sarebbe così

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

Quindi, quando è necessario aggiungerne uno, è possibile semplicemente inserirlo nell'array

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

Quindi si dispone di un indice basato su zero incorporato per il modo in cui sono elencati gli errori.


2

Molto più semplice con 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

In alternativa, in ES6 potrebbe essere utilizzata la sintassi di diffusione. ${Object.keys(alerts).length + 1}ritorna successivo idper avviso.

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

Mi dispiace ma non posso commentare le tue risposte già a causa della mia reputazione! ... quindi, se vuoi modificare la struttura del tuo oggetto, devi farlo come dice Thane Plummer, ma un piccolo trucco se non ti interessa dove per mettere l'articolo: verrà inserito in prima posizione se non si specifica il numero per l'inserimento.

Questo è meraviglioso se si desidera passare un oggetto Json ad esempio a una chiamata della funzione mongoDB e inserire una nuova chiave nelle condizioni che si ricevono. In questo caso inserirò un elemento myUid con alcune informazioni da una variabile all'interno del mio codice:

// 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] Dopo un po 'di jiggery pokery, questo ha funzionato per me:

 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);

Il problema che dovevo risolvere era che avrei potuto avere un numero qualsiasi di eventi e tutti avrebbero avuto lo stesso nome: LastPostedDateTime tutto ciò che è diverso è la data e l'ora.


-1

Prova questo:

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

Funziona abbastanza bene, lo aggiungerà all'inizio dell'array.


Questo non ha funzionato perché non posso chiamare la giunzione su un oggetto, solo su un array.
Richard Woolf,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.