Ajout d'éléments à l'objet

222

J'ai besoin de remplir un fichier json, maintenant j'ai quelque chose comme ça:

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

Et je dois ajouter un autre "élément". Ma première étape consiste à mettre ce json dans un type d'objet à l'aide cart = JSON.parse, maintenant je dois ajouter le nouvel élément. Je suppose que je dois utiliser cart.pushpour ajouter un autre élément, j'ai essayé ceci:

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

Mais j'ai eu l'erreur "L'objet n'a pas de méthode push" lorsque j'essaie de le faire element.push, et je pense que je fais quelque chose de TRÈS mal parce que je ne dis "l'élément" nulle part.

Comment puis je faire ça?

Edit: désolé pour tout ce que j'avais BEAUCOUP de confusion dans ma tête.

Je pensais que je ne peux obtenir que le type d'objet lors de la prise de données JSON.parse, mais j'obtiens d'abord ce que j'ai mis dans le JSON.

Mettre un tableau au lieu d'un objet a résolu mon problème, j'ai utilisé beaucoup de suggestions ici aussi, merci à tous!

HypeZ
la source
Object.assign (cible, source); peut être utilisé pour copier toutes les propriétés d'un objet source vers un objet cible.
David Spector

Réponses:

287

Votre élément n'est pas un tableau, mais votre panier doit être un tableau afin de prendre en charge de nombreux objets élément. Exemple de code:

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

Si vous souhaitez que cart soit un tableau d'objets dans le formulaire, { element: { id: 10, quantity: 1} }procédez comme suit:

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

JSON.stringify() a été mentionné comme une préoccupation dans le commentaire:

>> JSON.stringify([{a: 1}, {a: 2}]) 
      "[{"a":1},{"a":2}]" 
Konstantin Dinev
la source
2
merci, mais mon panier n'est plus un tableau et je ne peux pas faire le cart.push :( j'ai besoin d'un objet pour utiliser JSON.stringify (cart) après cette opération
HypeZ
@HypeZ Vous pouvez toujours stringifier le panier s'il s'agit d'un tableau d'objets.
Konstantin Dinev
Merci encore! Mais mes données de base sont le type d'objet à cause du "cart = JSON.parse (jsonfile)" au début .. je ne pense pas que je devrais prendre le json comme objet, le convertir en tableau, ajouter un élément, stringify ..
HypeZ
pour une raison quelconque, mon objet ne se remplit que du dernier élément. Par exemple, j'ai 4 éléments différents, mais dans un objet, les 4 éléments sont = la dernière solution de valeur que j'ai trouvée est create element = {}; à l'intérieur de pour, puis son travail correctement
Gorodeckij Dimitrij
1
@GorodeckijDimitrij Si vous réutilisez le même objet élément et que vous remplissez à nouveau ses clés avec de nouvelles valeurs, vous modifiez une seule et même instance d'élément, en le poussant encore et encore dans un tableau. Utilisez simplement un nouvel objet élément pour chaque élément que vous ajoutez, ce que vous avez fait dans le cadre d'une boucle for.
Konstantin Dinev
161

Avec cette rangée

var element = {};

vous définissez elementcomme un simple objet. L'objet JavaScript natif n'a pas de push()méthode. Pour ajouter de nouveaux éléments à un objet simple, utilisez cette syntaxe:

element[ yourKey ] = yourValue;

D'un autre côté, vous pouvez définir elementcomme un tableau en utilisant

var element = [];

Ensuite, vous pouvez ajouter des éléments à l'aide de push().

Sirko
la source
4
element[ yourKey ] = yourValue;est le meilleur moyen d'ajouter un élément à un objet.
Pramesh Bajracharya
Mais vous ne pouvez pas garantir l'ordre de l'élément ajouté dans l'objet avec element [yourKey] = yourValue;
RollerCosta
2
@Pramesh Bajracharya Il n'ajoute pas de valeurs à l'élément, il définit simplement l'élément actuel à cette valeur.
Hasen
1
@sommesh comment voulez-vous conserver le duplicata? vous pourriez faireelement[ yourkey ] = [ element{yourkey], yourNewValue ];
Sirko
1
@sommesh cela vous donnerait une clé en double, ce qui par définition n'est pas possible dans un objet JS. vous ne pouvez collecter que plusieurs valeurs pour une clé comme je l'ai montré précédemment.
Sirko
21

Si le panier doit être stocké en tant qu'objet et non en tableau (bien que je recommande de le stocker en tant que []), vous pouvez toujours modifier la structure pour utiliser l'ID comme clé:

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

Cela vous permet d'ajouter plusieurs articles au panier comme suit:

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

// Cart is now:
// { "1": { quantity: 5 }, "2": { quantity: 10 } }
Craig MacGregor
la source
merci, mais mon panier doit être un objet et non un tableau :(
HypeZ
3
L'une des raisons d'utiliser un objet comme celui-ci est que vous devez supprimer des éléments. La suppression d'une clé d'un objet est beaucoup plus facile que la suppression d'une clé d'un tableau.
bryc
Dans le cas où le commentaire de tableau de HypeZ rejette quelqu'un, la réponse de Craig n'ajoute pas de tableau, les crochets [] sont utilisés pour accéder à la propriété. Testez-le ici sur jsfiddle et lisez-le ici à Mozilla et voici un excellent article sur Digital Ocean que je souhaite avoir rencontré il y a longtemps.
Hastig Zusammenstellen
12

Pour ajouter à un objet, utilisez Object.assign

var ElementList ={}

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

Production:

{"élément": {"id": 10, "quantité": 1}, "element": {"id": 11, "quantité": 2}}

Melvin Chipimo
la source
C'est probablement la façon la plus fonctionnelle de faire les choses, mais un développeur javascript nouveau venu ne comprendra probablement pas cela.
codeninja
1
je l'ai essayé mais il remplacera l'élément existant, car les deux ont le même nom element, il n'aura donc que le dernier élément.
Haritsinh Gohil
7

Je lisais quelque chose en rapport avec cet essai si c'est utile.

1.Définissez une fonction push à l'intérieur d'un objet.

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

Maintenant, vous pouvez pousser des éléments comme un tableau

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

Cela produira cet objet

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

Notez que les éléments sont ajoutés avec des index et voyez également qu'il y a une nouvelle propriété de longueur ajoutée à l'objet. Cela sera utile pour trouver la longueur de l'objet aussi. Cela fonctionne en raison de la nature générique de la push()fonction

Thakur Karthik
la source
6

vous devez écrire var element = [];
en javascript {}est un objet vide et []est un tableau vide.

shift66
la source
6
cart.push({"element":{ id: id, quantity: quantity }});
Cris
la source
4
impossible de faire cart.push car cart est un objet maintenant! :(
HypeZ
une raison spécifique pour laquelle c'est un objet plutôt qu'un tableau?
Cris
parce que je l'ai obtenu de "cart = JSON.parse (jsonfile)" et qu'il donne un objet
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;
}

ce code est travaillé.

pashifika
la source
3

Essaye ça:

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
la source
3

Ajout de nouveaux éléments clé / paire dans l'objet d'origine:

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 nouvelle valeur:

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

Si quelqu'un cherche à créer un JSON similaire, juste sans l'utiliser cartcomme tableau, voici:

J'ai un tableau d'objets myArrcomme:

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

et je vais essayer de créer un JSON avec la structure suivante:

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

vous pouvez simplement faire-

var cart = {};
myArr.map(function(myObj){
                    cart[myObj.id]= myObj;
                    });
Saad Patel
la source
Comment ajoutez-vous une valeur à cette nouvelle structure JSON que vous avez créée?
Jude Fernandes
1
@JudeFernandes est cart[key]=valuefondamentalement une carte de valeurs clés. Faites un vote positif si la réponse vous a été utile. Merci!
Saad Patel
2

Pour ceux qui recherchent toujours une solution, je pense que les objets auraient dû être stockés dans un tableau comme ...

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

Ensuite, lorsque vous souhaitez utiliser un élément comme objet, vous pouvez le faire ...

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

Mettez une variable à "id_that_we_want" et donnez-lui l'id de l'élément que nous voulons de notre tableau. Un objet "elemnt" est retourné. Bien sûr, nous n'avons pas besoin de nous pour trouver l'objet. Nous pourrions utiliser n'importe quelle autre propriété pour faire la recherche.

Dave
la source
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
la source
Bien que ce soit un moyen d'obtenir les mêmes résultats, cette solution n'est pas nette.
warunapww
1

push est une méthode de tableaux, donc pour l'objet, vous pouvez obtenir l'index du dernier élément, et vous pouvez probablement faire le même travail que push pour l'objet comme ci-dessous

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

puis ajouter un objet au nouvel index de l'élément

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

si vous ne concevez pas pour faire une boucle avec JS, par exemple passez à PHP pour faire une boucle pour vous

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

ce concept peut aider un peu


la source
1

C'est une vieille question, de toute façon aujourd'hui la meilleure pratique est d'utiliser 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
la source