Je cherche à écrire une fonction qui peut rechercher une valeur basée sur une clé et remplacer cette valeur par une autre. La clé est un arbre à partir du nœud de début de JSON. Voici l'exemple.
var myData = { name : 'Dan', address: { city : 'Santa Clara', details : { 'prevhouse' : '' } } }
L'entrée à la fonction est un arbre clé. Par exemple, myData-address-details-prevouse
Lorsque je passe cette clé avec une nouvelle valeur, disons 'Texas', la valeur précédente sera changée pour la nouvelle valeur que j'envoie.
Et le nouveau JSON sera
var myData = { name : 'Dan', address: { city : 'Santa Clara', details : { 'prevhouse' : 'Texas' } } }
Voici ce que j'ai écrit jusqu'ici
var tree = key.split("-");
Maintenant, la variable arborescente contient ["myData", "adresse", "détails", "prevouse"]
Je sais que nous pouvons accéder à l'objet en utilisant myData [tree [0]] [tree [1]] [tree [2]], mais en quelque sorte, il n'est pas capable de le rendre dynamique à partir de la valeur analysée.
Comment générons-nous cela de façon dynamique car la durée de la profondeur n'est pas connue jusqu'à l'exécution.
J'espère obtenir de l'aide.
Essayez avec ce code:
var myData = { name: 'Dan', address: { city: 'Santa Clara', details: { prevhouse: '' } } }; function setAttribute(obj, key, value) { var i = 1, attrs = key.split('-'), max = attrs.length - 1; for (; i < max; i++) { attr = attrs[i]; obj = obj[attr]; } obj[attrs[max]] = value; console.log('myData=', myData); } setAttribute(myData, "myData-address-details-prevhouse", "Texas");
Ici une démonstration jsfiddle en cours d'exécution; Voir la console pour le résultat
Vous devriez pouvoir itérer à travers chaque clé car votre JSON est juste un objet JS. Donc passez par chaque clé, vérifiez si elle est définie, si c'est le cas, utilisez cet objet pour votre prochaine vérification. Cela vous amènera où vous voulez aller. Gardez à l'esprit que vous définirez la dernière clé de votre valeur.
Code psuedo basique sans traiter le réglage:
obj = data; for (key in keys) { obj = obj[key] }
Quelque chose comme cela ferait:
function update(node, path, value) { path = path.split('-'); do { node = node[path.splice(0, 1)]; } while(path.length > 1); node[path[0]] = value; }
Étant donné que myData
est l'objet, je pense que vous devriez utiliser myData[tree[1]][tree[2]][tree[3]]
et jeter le premier élément dans le tableau.
Quelque chose comme ça devrait fonctionner de manière récursive (non testé)
function updateValue(obj, key, value) { var keys = key.split('-'); updateObjectValue(obj, keys.shift(), value); } function updateObjectValue(obj, keyArray, value) { if (keyArray.length == 1) { obj[keyArray[0]] = value; } else if (keyArray.length > 1) { updateObject(obj[keyArray[0]], keyArray.shift(), value); } }