Recherchez une valeur pour une clé donnée dans JSON et modifiez la valeur à l'aide de javascript

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