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?


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

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

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

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


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

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!!


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"

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.


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

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


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


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.


-1

Tente o seguinte:

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

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


Isso não funcionou porque não posso chamar emenda em um objeto, apenas em uma matriz.
Richard Woolf
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.