web-dev-qa-db-fra.com

Ajouter dynamiquement des paires de valeurs de nom de variable à un objet JSON

J'ai un objet json plein d'ips comme

var ips = {}

J'ajoute ensuite des objets ip à cet objet comme si

ips[ipID] = {}

J'ai ensuite besoin d'ajouter des paires valeur/nom de variable/dynamique à chaque adresse IP pour utiliser un code comme celui-ci.

var name; var value; var temp = {};
tmp[name] = value

Ma question est la suivante: comment puis-je ajouter ces paires nom-valeur/tmp à mes objets ipID afin que mon résultat soit le suivant?

ipID = { name : value, anotherName : anotherValue }
57
Mike

Ce n'est pas JSON. Ce ne sont que des objets Javascript et n’ont absolument rien à voir avec JSON.

Vous pouvez utiliser des crochets pour définir les propriétés de manière dynamique. Exemple:

var obj = {};
obj['name'] = value;
obj['anotherName'] = anotherValue;

Cela donne exactement la même chose que créer l'objet avec un littéral d'objet comme celui-ci:

var obj = { name : value, anotherName : anotherValue };

Si vous avez déjà ajouté l'objet à la collection ips, vous utilisez une paire de crochets pour accéder à l'objet de la collection et une autre paire pour accéder à la propriété de l'objet:

ips[ipId] = {};
ips[ipId]['name'] = value;
ips[ipId]['anotherName'] = anotherValue;

Notez la similarité avec le code ci-dessus, mais que vous utilisez juste ips[ipId] au lieu de obj.

Vous pouvez également obtenir une référence à l'objet à partir de la collection et l'utiliser pour accéder à l'objet tant qu'il reste dans la collection:

ips[ipId] = {};
var obj = ips[ipId];
obj['name'] = value;
obj['anotherName'] = anotherValue;

Vous pouvez utiliser des variables de chaîne pour spécifier les noms des propriétés:

var name = 'name';
obj[name] = value;
name = 'anotherName';
obj[name] = anotherValue;

C'est la valeur de la variable (la chaîne) qui identifie la propriété, donc pendant que vous utilisez obj[name] pour les deux propriétés dans le code ci-dessus, c'est la chaîne dans la variable au moment où vous y accédez qui détermine la propriété qui sera consultée.

164
Guffa

Avec ECMAScript 6, il existe un meilleur moyen.

Vous pouvez utiliser noms de propriété calculés dans les définitions de propriété d'objet, par exemple:

var name1 = 'John'; 
var value1 = '42'; 
var name2 = 'Sarah'; 
var value2 = '35';

var ipID = { 
             [name1] : value1, 
             [name2] : value2 
           }

Ceci est équivalent à ce qui suit, où vous avez des variables pour les noms de propriété.

var ipID = { 
             John: '42', 
             Sarah: '35' 
           }
20
Dylan Hogg

lorsque vous utilisez des objets javascript, vous pouvez également simplement utiliser la "notation par points" pour ajouter un élément, ( que JSLint préfère )

var myArray = { name : "john" };
//will initiate a key-value array with one item "name" and the value "john"
myArray.lastName = "smith";
//will add a key named lastName with the value "smith"
//Object {name: "john", lastName: "smith"}

Voici une capture d'écran des tests effectués dans la console Chrome

screenshot

7
Max

Je suppose que chaque entrée dans "ips" peut avoir plusieurs paires nom-valeur - elle est donc imbriquée. Vous pouvez réaliser cette structure de données en tant que telle:

var ips = {}

function addIpId(ipID, name, value) {
    if (!ips[ipID]) ip[ipID] = {};
    var entries = ip[ipID];
    // you could add a check to ensure the name-value par's not already defined here
    var entries[name] = value;
}
5
orangepips

en Javascript.

    var myObject = { "name" : "john" };
    // { "name" : "john" };
    myObject.gender = "male";
    // { "name" : "john", "gender":"male"};
3
Atif Hussain

si ma compréhension de votre code JSON initial est correcte, l'une ou l'autre de ces solutions peut vous aider à parcourir tous les identifiants ip et à affecter à chacun d'eux un nouvel objet.

// initial JSON
var ips = {ipId1: {}, ipId2: {}};

// Solution1
Object.keys(ips).forEach(function(key) {
  ips[key] = {name: 'value', anotherName: 'another value'};
});

// Solution 2
Object.keys(ips).forEach(function(key) {
  Object.assign(ips[key],{name: 'value', anotherName: 'another value'});
});

à confirmer:

console.log(JSON.stringify(ips, null, 2));

La déclaration ci-dessus crache:

{
  "ipId1": {
    "name":"value",
    "anotherName":"another value"
  },
  "ipId2": {
    "name":"value",
    "anotherName":"another value"
  }
}
1
Hamzeen Hameem

D'après ce que les autres réponses ont proposé, je pense que cela pourrait aider:

var object = ips[ipId];
var name = "Joe";
var anothername = "Fred";
var value = "Thingy";
var anothervalue = "Fingy";
object[name] = value;
object[anothername] = anothervalue;

Cependant, ceci n'est pas testé, juste une hypothèse basée sur la répétition constante de:

object["string"] = value;
//object = {string: value}
1
user4953229

Vous pouvez y parvenir en utilisant Lodash _.assign fonction.

var ipID = {};
_.assign(ipID, {'name': "value"}, {'anotherName': "anotherValue"});
console.log(ipID);
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>
0
Penny Liu