Anexando a um objeto

156

Eu tenho um objeto que contém alertas e algumas informações sobre eles:

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

Além disso, tenho uma variável que diz quantos alertas existem alertNo,. Minha pergunta é: quando vou adicionar um novo alerta, existe uma maneira de anexar o alerta ao alertsobjeto?

Steve Gattuso
fonte
6
Acho que você tem um problema com o seu json publicado: 1: {app: 'helloworld', 'message'} => 1: {app: 'helloworld', mensagem: 'a message'}?
Andreas Grech

Respostas:

235

Que tal armazenar os alertas como registros em uma matriz em vez de propriedades de um único objeto?

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

E para adicionar um, basta usar push:

alerts.push({num : 3, app:'helloagain_again',message:'yet another message'});
Andreas Grech
fonte
1
Esta resposta espera que você saiba o ID do alerta a ser adicionado. Bem, se você já sabe que, em seguida, você pode simplesmente seguir o formato objeto original e fazer: alerts[3] = { app: 'hello3', message: 'message 3' }. Com isso, você pode acessar uma mensagem por id: alerts[2] => { app: 'helloworld', message: 'message' }. Obtendo o comprimento é então apenas: Object.keys(alerts).length(que pouco é mais fácil com matrizes)
Matt
61

O jQuery $.extend(obj1, obj2)mesclaria 2 objetos para você, mas você realmente deveria estar usando uma matriz.

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);
respectTheCode
fonte
A extensão do JQuery é lenta: trevmex.com/post/2531629773/jquerys-extend-is-slow . Além disso, há um erro de digitação. $ .extends () deve ler $ .extend ().
ken
Boa captura com o erro de digitação. Existem situações em que $ .extends é útil, mas você está certo de que deve ser evitado quando possível.
RespectTheCode 5/04
1
Eu acho que se estendem () é ok, quando você só tem uma estrutura de um registro, sem os colchetes, para o resto concordo com respectTheCode, basta usar push ()
elvenbyte
39

Você pode fazer isso com Object.assign () . Às vezes, você precisa de uma matriz, mas ao trabalhar com funções que esperam um único objeto JSON - como uma chamada OData -, achei esse método mais simples do que criar uma matriz apenas para descompactá-lo.

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: Para endereçar o comentário sobre a obtenção da próxima chave, você pode obter uma matriz de chaves com a função Object.keys () - consulte a resposta de Vadi para obter um exemplo de incremento da chave. Da mesma forma, você pode obter todos os valores com Object.values ​​() e pares de valores-chave com Object.entries () .

var alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
}
console.log(Object.keys(alerts))
// Output
Array [ "1", "2" ]
Thane Plummer
fonte
7
Esta é realmente a resposta correta, pois os outros estão se referindo à transformação do objeto na matriz, mas dessa forma você o mantém como objeto. No caso do autor, é possível que seja melhor ele trabalhar com as matrizes, mas essa seria a resposta sobre como anexar a um objeto.
Goran Jakovljevic
2
sim, eu concordo ..Em questão, não há uma matriz de objetos, é apenas um objeto, então esta é a resposta perfeita!
Kishan Oza #
Esta é a resposta correta, porém; como você pode saber qual índice você adicionará novo objeto?
Capan 15/03/19
1
esta é a resposta para a pergunta do título.
FistOfFury 23/08/19
11

Como outras respostas apontadas, você pode achar mais fácil trabalhar com uma matriz.

Se não:

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

tente:

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

MC
fonte
Isso não funcionará se você excluiu alertas ou pulou uma chave. Você deve adicionar algo ao longo das linhas de while(alerts[size]) size++;E provavelmente renomear sizepara newId.
Até
11

Você pode usar a sintaxe de propagação da seguinte maneira.

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

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

Agora, com o ES6, temos um operador de propagação muito poderoso (... Objeto), que pode facilitar esse trabalho. Isso pode ser feito da seguinte maneira:

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
 }

É isso aí. Ele adicionará a chave que você deseja. Espero que isto ajude!!

Harshit Agarwal
fonte
6

Você realmente deve seguir a série de sugestões de alertas, mas, caso contrário, adicionar ao objeto que você mencionou ficaria assim:

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

Mas como você não deve usar números literais, os nomes citam tudo e seguem com

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

ou você pode criar uma variedade de objetos.

Acessar parece

alerts['1'].app
=> "helloworld"
dlamblin
fonte
5

Você tem a capacidade de alterar a estrutura mais externa para uma matriz? Então ficaria assim

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

Então, quando você precisava adicionar um, basta colocá-lo no array

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

Você tem um índice interno baseado em zero para saber como os erros são enumerados.

Peter Bailey
fonte
2

Muito mais fácil com o 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}
}
Maroun Melhem
fonte
0

Como alternativa, no ES6, a sintaxe de propagação pode ser usada. ${Object.keys(alerts).length + 1}retorna em seguida idpara alerta.

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

Vadi
fonte
0

Sinto muito, mas não posso comentar suas respostas já devido à minha reputação! ... então, se você quiser modificar a estrutura do seu objeto, deve fazê-lo que Thane Plummer diz, mas um pequeno truque se você não se importa onde para colocar o item: ele será inserido na primeira posição se você não especificar o número da inserção.

Isso é maravilhoso se você deseja passar um objeto Json, por exemplo, para uma chamada de função do mongoDB e inserir uma nova chave dentro das condições que você recebe. Neste caso, vou inserir um item myUid com algumas informações de uma variável dentro do meu código:

// 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();
}

Marc
fonte
0

[Javascript] Depois de um pouco de brincadeira, isso funcionou para mim:

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

O problema que eu precisava resolver era que eu poderia ter qualquer número de eventos e todos teriam o mesmo nome: LastPostedDateTime, o que é diferente é a data e a hora.

David White
fonte
-1

Tente o seguinte:

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

Funciona muito bem, ele será adicionado ao início da matriz.

HM2K
fonte
Isso não funcionou porque não posso chamar emenda em um objeto, apenas em uma matriz.
Richard Woolf