Adicionando elementos ao objeto

222

Eu preciso preencher um arquivo json, agora tenho algo parecido com isto:

{"element":{"id":10,"quantity":1}}

E eu preciso adicionar outro "elemento". Meu primeiro passo é colocar esse json em um tipo de objeto usando cart = JSON.parse, agora eu preciso adicionar o novo elemento. Eu deveria usar cart.pushpara adicionar outro elemento, tentei o seguinte:

var element = {};
element.push({ id: id, quantity: quantity });
cart.push(element);

Mas recebi o erro "O objeto não tem método de envio" quando tento fazer element.push, e acho que estou fazendo algo MUITO errado, porque não estou dizendo o "elemento" em lugar algum.

Como eu posso fazer isso?

Edit: desculpe a todos, eu tinha muita confusão na minha cabeça.

Eu pensei que poderia obter apenas o tipo de objeto ao obter dados JSON.parse, mas recebo o que coloquei no JSON em primeiro lugar.

Colocar array em vez de objeto resolveu meu problema, usei muitas sugestões aqui também, obrigado a todos!

HypeZ
fonte
Object.assign (destino, origem); pode ser usado para copiar todas as propriedades de um objeto de origem para um objeto de destino.
David Spector

Respostas:

287

Seu elemento não é uma matriz, no entanto, seu carrinho precisa ser uma matriz para suportar muitos objetos de elemento. Exemplo de código:

var element = {}, cart = [];
element.id = id;
element.quantity = quantity;
cart.push(element);

Se você deseja que o carrinho seja uma matriz de objetos no formulário { element: { id: 10, quantity: 1} }, execute:

var element = {}, cart = [];
element.id = id;
element.quantity = quantity;
cart.push({element: element});

JSON.stringify() foi mencionado como uma preocupação no comentário:

>> JSON.stringify([{a: 1}, {a: 2}]) 
      "[{"a":1},{"a":2}]" 
Konstantin Dinev
fonte
2
obrigado, mas meu carrinho de agora não é um array e eu não posso fazer o cart.push :( i precisa de um objeto para usar JSON.stringify (carrinho) após esta operação
HypeZ
@HypeZ Você ainda pode restringir o carrinho se ele for uma matriz de objetos.
Konstantin Dinev
obrigado novamente! Mas meus dados base são a causa do tipo de objeto "cart = JSON.parse (jsonfile)" no início ... acho que não devo pegar o json como um objeto, convertê-lo em matriz, adicionar elemento, stringify ..
HypeZ
por alguma razão, meu objeto fica preenchido apenas com o último elemento. por exemplo, tenho 4 itens diferentes, mas em um objeto todos os 4 elementos são = último valor que a solução que encontrei é create element = {}; dentro de para, então seu trabalho corretamente
Gorodeckij Dimitrij
1
@GorodeckijDimitrij Se você estiver reutilizando o mesmo objeto de elemento e repovoando suas chaves com novos valores, modificaria uma e a mesma instância do elemento, empurrando-o repetidamente em uma matriz. Basta usar um novo objeto de elemento para cada elemento que você está adicionando, o que você fez no escopo de um loop for.
Konstantin Dinev
160

Com essa linha

var element = {};

você define elementcomo um objeto simples. O objeto JavaScript nativo não possui push()método. Para adicionar novos itens a um objeto simples, use esta sintaxe:

element[ yourKey ] = yourValue;

Por outro lado, você pode definir elementcomo uma matriz usando

var element = [];

Então você pode adicionar elementos usando push().

Sirko
fonte
4
element[ yourKey ] = yourValue;é a melhor maneira de adicionar um elemento a um objeto.
Pramesh Bajracharya
Mas você não pode conceder a ordem do elemento adicionado no objeto com o elemento [yourKey] = yourValue;
RollerCosta
2
@Pramesh Bajracharya Não adiciona valores ao elemento, apenas define o elemento atual para esse valor.
Hasen
1
@smmesh como você deseja manter a duplicata? você poderia fazerelement[ yourkey ] = [ element{yourkey], yourNewValue ];
Sirko
1
@ Sommesh, isso daria uma chave duplicada, o que, por definição, não é possível em um objeto JS. você só pode coletar vários valores para uma chave, como mostrei antes.
Sirko
21

Se o carrinho tiver que ser armazenado como um objeto e não como uma matriz (embora eu recomendo armazenar como um []), você sempre poderá alterar a estrutura para usar o ID como chave:

var element = { quantity: quantity };
cart[id] = element;

Isso permite que você adicione vários itens ao carrinho da seguinte maneira:

cart["1"] = { quantity: 5};
cart["2"] = { quantity: 10};

// Cart is now:
// { "1": { quantity: 5 }, "2": { quantity: 10 } }
Craig MacGregor
fonte
obrigado, mas meu carrinho precisa ser um objeto e não um array :(
HypeZ
3
Um motivo para usar um objeto como esse é se você precisar excluir itens. Excluir uma chave de um objeto é muito mais fácil do que excluir uma chave de uma matriz.
11239 bryc #
Caso o comentário do array do HypeZ atinja alguém, a resposta de Craig não adiciona um array, os colchetes [] são usados ​​para acessar a propriedade. Teste aqui no jsfiddle e leia sobre isso aqui na Mozilla e aqui está um ótimo artigo na Digital Ocean que eu gostaria de encontrar há muito tempo.
Hastig Zusammenstellen 27/08/18
12

Para acrescentar a um objeto, use Object.assign

var ElementList ={}

function addElement (ElementList, element) {
    let newList = Object.assign(ElementList, element)
    return newList
}
console.log(ElementList)

Resultado:

{"elemento": {"id": 10, "quantidade": 1}, "elemento": {"id": 11, "quantidade": 2}}

Melvin Chipimo
fonte
Esta é provavelmente a maneira mais funcional de fazer as coisas, mas um desenvolvedor javascript recém-chegado provavelmente não entenderá isso.
Codeninja 15/07/19
1
Eu tentei, mas ele substituirá o elemento existente, porque ambos têm o mesmo nome element, portanto, ele terá apenas o último elemento.
Haritsinh Gohil 01/08/19
6

você deve escrever var element = [];
em javascript {}é um objeto vazio e []é uma matriz vazia.

shift66
fonte
6
cart.push({"element":{ id: id, quantity: quantity }});
Cris
fonte
4
não pode fazer cart.push porque carrinho é um objeto agora! :(
HypeZ
alguma razão específica para que seja um objeto e não um array?
Cris
porque eu peguei em "cart = JSON.parse (jsonfile)" e dá um objeto
HypeZ
6

Eu estava lendo algo relacionado a essa tentativa, se for útil.

1. Defina uma função push dentro de um objeto.

let obj={push:function push(element){ [].push.call(this,element)}};

Agora você pode enviar elementos como uma matriz

obj.push(1)
obj.push({a:1})
obj.push([1,2,3])

Isso produzirá esse objeto

obj={
 0: 1
 1: {a: 1}
 2: (3) [1, 2, 3]
 length: 3
}

Observe que os elementos são adicionados com índices e também observe que há uma nova propriedade de comprimento adicionada ao objeto. Isso também será útil para encontrar o comprimento do objeto. Isso funciona devido à natureza genérica da push()função

Thakur Karthik
fonte
5
function addValueInObject(object, key, value) {
    var res = {};
    var textObject = JSON.stringify(object);
    if (textObject === '{}') {
        res = JSON.parse('{"' + key + '":"' + value + '"}');
    } else {
        res = JSON.parse('{' + textObject.substring(1, textObject.length - 1) + ',"' + key + '":"' + value + '"}');
    }
    return res;
}

este código é trabalhado.

pashifika
fonte
3

Tente o seguinte:

var data = [{field:"Data",type:"date"},  {field:"Numero",type:"number"}];

var columns = {};

var index = 0;

$.each(data, function() {

    columns[index] = {
        field : this.field,
        type : this.type
    };

    index++;
});

console.log(columns);
user3910831
fonte
3

Adicionando novos elementos de chave / par ao objeto original:

const obj = { a:1, b:2 }
const add = { c:3, d:4, e: ['x','y','z'] }

Object.entries(add).forEach(([key,value]) => {obj[key] = value })

obj novo valor:

{a: 1, b: 2, c: 3, d: 4, e: ["x", "y", "z"] }
Banzy
fonte
2

Se alguém procura criar um JSON semelhante, apenas sem usar cartcomo uma matriz, aqui vai:

Eu tenho uma matriz de objetos myArrcomo:

var myArr = [{resourceType:"myRT",
            id: 1,
            value:"ha"},
            {resourceType:"myRT",
            id: 2,
            value:"he"},
            {resourceType:"myRT",
            id: 3,
            value:"Li"}];

e tentarei criar um JSON com a seguinte estrutura:

{
 "1":{"resourceType":"myRT","id":"1","value":"ha"},
 "2":{"resourceType":"myRT","id":"2","value":"he"},
 "3":{"resourceType":"myRT","id":"3","value":"Li"}
}

você pode simplesmente fazer

var cart = {};
myArr.map(function(myObj){
                    cart[myObj.id]= myObj;
                    });
Saad Patel
fonte
Como você adiciona um valor a essa nova estrutura JSON que você criou?
Jude Fernandes
1
@JudeFernandes é cart[key]=valuebasicamente um mapa de valores-chave. Voto positivo se a resposta foi útil. Obrigado!
Saad Patel
2

Para quem ainda procura uma solução, acho que os objetos deveriam ter sido armazenados em uma matriz como ...

var element = {}, cart = [];
element.id = id;
element.quantity = quantity;
cart.push(element);

Então, quando você quiser usar um elemento como objeto, poderá fazer isso ...

var element = cart.find(function (el) { return el.id === "id_that_we_want";});

Coloque uma variável em "id_that_we_want" e forneça o ID do elemento que queremos da nossa matriz. Um objeto "elemnt" é retornado. É claro que não precisamos nos identificar para encontrar o objeto. Poderíamos usar qualquer outra propriedade para fazer a descoberta.

Dave
fonte
1
 function addValueInObject(value, object, key) {

        var addMoreOptions = eval('{"'  + key + '":' +  value + '}');

        if(addMoreOptions != null) {
            var textObject = JSON.stringify(object);
            textObject = textObject.substring(1,textObject.length-1);
            var AddElement = JSON.stringify(addMoreOptions);
            object = eval('{' + textObject +','+  AddElement.substring(1,AddElement.length-1) + '}');
        }
        return object;
    }

addValueInObject('sdfasfas', yourObject, 'keyname');

OU:

var obj = {'key':'value'};

obj.key2 = 'value2';
Ivan Ferrer
fonte
Embora essa seja uma maneira de obter os mesmos resultados, essa solução não é clara.
Warunapww
1

push é um método de matrizes, portanto, para objeto, você pode obter o índice do último elemento e provavelmente pode fazer o mesmo trabalho que push para objeto, conforme abaixo

var lastIndex = Object.keys(element)[Object.keys(element).length-1];

Em seguida, adicione o objeto ao novo índice do elemento

element[parseInt(lastIndex) +1] = { id: id, quantity: quantity };
ganesh
fonte
1

se você não deseja fazer loop em JS, por exemplo, passe para PHP para fazer loop para você

let decision = {}
decision[code+'#'+row] = event.target.value

esse conceito pode ajudar um pouco


fonte
1

Essa é uma pergunta antiga. Hoje, a melhor prática é usar Object.defineProperty

const object1 = {};

Object.defineProperty(object1, 'property1', {
  value: 42,
  writable: false
});

object1.property1 = 77;
// throws an error in strict mode

console.log(object1.property1);
// expected output: 42
user8271796
fonte