Aggiunta di elementi all'oggetto


222

Ho bisogno di popolare un file json, ora ho qualcosa del genere:

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

E devo aggiungere un altro "elemento". Il mio primo passo è mettere quel json in un tipo di oggetto usando cart = JSON.parse, ora ho bisogno di aggiungere il nuovo elemento. Ho supposto di dover usare cart.pushper aggiungere un altro elemento, ho provato questo:

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

Ma ho ricevuto l'errore "L'oggetto non ha alcun metodo push" quando provo a fare element.push, e penso che sto facendo qualcosa di MOLTO sbagliato perché non sto dicendo "l'elemento" da nessuna parte.

Come lo posso fare?

Modifica: scusa per tutto ciò che avevo molta confusione nella mia testa.

Pensavo di poter ottenere solo il tipo di oggetto quando prendevo i dati JSON.parse, ma in primo luogo ottengo quello che ho inserito nel JSON.

Mettere array anziché oggetto ha risolto il mio problema, ho usato anche molti suggerimenti qui, grazie a tutti!



Object.assign (target, source); può essere utilizzato per copiare tutte le proprietà da un oggetto di origine a un oggetto di destinazione.
David Spector,

Risposte:


287

Il tuo elemento non è un array, tuttavia il carrello deve essere un array per supportare molti oggetti element. Esempio di codice:

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

Se si desidera che il carrello sia una matrice di oggetti nel modulo, { element: { id: 10, quantity: 1} }eseguire:

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

JSON.stringify() è stato menzionato come preoccupazione nel commento:

>> JSON.stringify([{a: 1}, {a: 2}]) 
      "[{"a":1},{"a":2}]" 

2
grazie, ma il mio carrello ora non è un array e non posso fare il cart.push :( ho bisogno di un oggetto per usare JSON.stringify (carrello) dopo questa operazione
HypeZ

@HypeZ Puoi ancora stringere il carrello se si tratta di una matrice di oggetti.
Konstantin Dinev,

grazie ancora! Ma i miei dati di base sono il tipo di oggetto causa di "cart = JSON.parse (jsonfile)" all'inizio .. non credo che dovrei prendere il json come oggetto, convertirlo in array, aggiungere elemento, stringere ..
HypeZ

per qualche motivo, il mio oggetto si riempie solo dell'ultimo elemento. ad es. ho 4 articoli diversi, ma in un oggetto tutti e 4 gli elementi sono = last value soluzione che ho trovato è create element = {}; all'interno di per, quindi funziona correttamente
Gorodeckij Dimitrij

1
@GorodeckijDimitrij Se stai riutilizzando lo stesso oggetto element e ripopoli le sue chiavi con nuovi valori, allora modificheresti la stessa istanza dell'elemento, spingendolo ancora e ancora in un array. Usa un nuovo oggetto element per ogni elemento che stai aggiungendo, che è quello che hai fatto nell'ambito di un for-loop.
Konstantin Dinev,

161

Con quella fila

var element = {};

tu definisci elementun semplice oggetto. L'oggetto JavaScript nativo non ha push()metodo. Per aggiungere nuovi elementi a un oggetto semplice utilizzare questa sintassi:

element[ yourKey ] = yourValue;

D'altra parte, è possibile definire elementcome un array usando

var element = [];

Quindi puoi aggiungere elementi usando push().


4
element[ yourKey ] = yourValue;è il modo migliore per aggiungere elementi a un oggetto.
Pramesh Bajracharya,

Ma non puoi garantire l'ordine dell'elemento aggiunto nell'oggetto con element [yourKey] = yourValue;
RollerCosta

2
@Pramesh Bajracharya Non aggiunge valori all'elemento, imposta semplicemente l'elemento corrente su quel valore.
Hasen,

1
@sommesh come vuoi conservare il duplicato? potresti fareelement[ yourkey ] = [ element{yourkey], yourNewValue ];
Sirko,

1
@sommesh questo ti darebbe una chiave duplicata, che per definizione non è possibile in un oggetto JS. puoi raccogliere solo più valori per una chiave come ho mostrato prima.
Sirko,

21

Se il carrello deve essere archiviato come oggetto e non come array (anche se consiglierei di memorizzarlo come []), puoi sempre modificare la struttura per utilizzare l'ID come chiave:

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

Ciò ti consente di aggiungere più articoli al carrello in questo modo:

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

// Cart is now:
// { "1": { quantity: 5 }, "2": { quantity: 10 } }

grazie, ma il mio carrello deve essere un oggetto e non un array :(
HypeZ

3
Un motivo per utilizzare un oggetto come questo è se è necessario eliminare elementi. L'eliminazione di una chiave da un oggetto è molto più semplice dell'eliminazione di una chiave da un array.
bryc,

Nel caso in cui il commento dell'array di HypeZ butti via qualcuno, la risposta di Craig non aggiunge un array, le parentesi [] vengono utilizzate per accedere alla proprietà. Provatelo qui in jsfiddle e leggere su di esso qui a Mozilla e qui c'è un grande articolo a Ocean Digital che vorrei mi sono imbattuto molto tempo fa.
Hastig Zusammenstellen,

12

Per aggiungere a un oggetto utilizzare Object.assign

var ElementList ={}

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

Produzione:

{ "Elemento": { "id": 10, "quantità": 1}, "elemento": { "id": 11, "quantità": 2}}


Questo è probabilmente il modo più funzionale di fare le cose, ma probabilmente un nuovo sviluppatore di JavaScript non lo capirà.
codeninja,

1
l'ho provato ma sovrascriverà l'elemento esistente, perché entrambi hanno lo stesso nome element, quindi avrà solo l'ultimo elemento.
Haritsinh Gohil,

7

Stavo leggendo qualcosa legato a questo tentativo, se è utile.

1. Definire una funzione push all'interno di un oggetto.

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

Ora puoi spingere elementi come un array

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

Questo produrrà questo oggetto

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

Nota che gli elementi sono aggiunti con indici e vedi anche che c'è una nuova proprietà length aggiunta all'oggetto. Questo sarà utile per trovare anche la lunghezza dell'oggetto. Funziona a causa della natura generica della push()funzione


6

dovresti scrivere var element = [];
in javascript {}è un oggetto vuoto ed []è un array vuoto.


6
cart.push({"element":{ id: id, quantity: quantity }});

4
non posso fare cart.push perché il carrello è un oggetto ora! :(
HypeZ

qualche motivo specifico per cui si tratta di un oggetto anziché di un array?
Cris,

perché l'ho preso da "cart = JSON.parse (jsonfile)" e dà un oggetto
HypeZ

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

questo codice è funzionato.


3

Prova questo:

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

3

Aggiunta di nuovi elementi chiave / coppia nell'oggetto originale:

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

nuovo valore:

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

2

Se qualcuno cerca di creare un JSON simile, semplicemente senza utilizzarlo cartcome array, ecco:

Ho una serie di oggetti myArrcome:

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

e tenterò di creare un JSON con la seguente struttura:

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

puoi semplicemente fare-

var cart = {};
myArr.map(function(myObj){
                    cart[myObj.id]= myObj;
                    });

Come si aggiunge un valore a quella nuova struttura JSON che è stata creata?
Jude Fernandes,

1
@JudeFernandes è cart[key]=valuefondamentalmente una mappa dei valori chiave. Valuta se la risposta è stata utile. Grazie!
Saad Patel,

2

Per chiunque sia ancora alla ricerca di una soluzione, penso che gli oggetti avrebbero dovuto essere archiviati in un array come ...

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

Quindi quando vuoi usare un elemento come oggetto puoi farlo ...

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

Metti una variabile in "id_that_we_want" e assegnagli l'id dell'elemento che vogliamo dal nostro array. Viene restituito un oggetto "elemnt". Naturalmente non abbiamo bisogno di noi per trovare l'oggetto. Potremmo usare qualsiasi altra proprietà per fare la ricerca.


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

O:

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

obj.key2 = 'value2';

Mentre questo è un modo per ottenere gli stessi risultati, questa soluzione non è pulita.
warunapww,

1

push è un metodo di array, quindi per l'oggetto è possibile ottenere l'indice dell'ultimo elemento e probabilmente si può fare lo stesso lavoro di push per l'oggetto come di seguito

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

quindi aggiungi l'oggetto al nuovo indice dell'elemento

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

1

se non si progetta di eseguire il loop con in JS, ad es. passare a PHP per eseguire il loop

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

questo concetto può aiutare un po '


1

Questa è una vecchia domanda, comunque oggi la migliore pratica è usare 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
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.