Trouver et mettre à jour dans l'objet json imbriqué sans changer la même valeur de paire de clés dans le chemin enfant différent

Ceci est une mise à jour de ma question précédente Recherche et mise à jour dans l'objet json imbriqué

Exemples de données

TestObj = { "Categories": [{ "Products": [{ "id": "a01", "name": "Pine", "description": "Short description of pine." }, { "id": "a02", "name": "Pine", "description": "Short description of pine." }, { "id": "a03", "name": "Poplar", "description": "Short description of poplar." }], "id": "A", "title": "Cheap", "description": "Short description of category A." }, { "Product": [{ "id": "b01", "name": "Maple", "description": "Short description of maple." }, { "id": "b02", "name": "Oak", "description": "Short description of oak." }, { "id": "b03", "name": "Bamboo", "description": "Short description of bamboo." }], "id": "B", "title": "Moderate", "description": "Short description of category B." }] }; 

Ma fonction

 function getObjects(obj, key, val, newVal) { var newValue = newVal; var objects = []; for (var i in obj) { if (!obj.hasOwnProperty(i)) continue; if (typeof obj[i] == 'object') { objects = objects.concat(getObjects(obj[i], key, val, newValue)); } else if (i == key && obj[key] == val) { obj[key] = newValue; } } return obj; } 

Appelé comme

 getObjects(TestObj, 'id', 'A', 'B'); 

Cela fonctionne bien si je vais mettre à jour l'identifiant; Puisque id n'a pas de doublons. Mais si je suis en train de mettre à jour le nom, toutes les données correspondant à la paire de valeurs clés sont mises à jour. Mais comment le contraindre à une valeur de paire de clés particulière.

Que dois-je fournir à la fonction pour limiter la portée de la mise à jour et comment la mettre en œuvre. Aidez-moi, s'il vous plaît.

Remarque: Le json que je manipulerai b sera généré dynamiquement, donc je ne peux pas avoir de code codé dur dans la fonction

Je pense que vous pouvez en quelque sorte utiliser un chemin pour localiser la valeur, puis faire la mise à jour. J'ai eu l'idée de cette publication . (Répondu par @shesek)

 var getPath = function (obj, path, newValue) { var parts = path.split('.'); while (parts.length > 1 && (obj = obj[parts.shift()])); obj[parts.shift()] = newValue; return obj; } console.log(getPath(TestObj, 'Categories.0.Products.1.id', 'AAA')) console.log(TestObj) 

Ainsi, vous pouvez passer le chemin de l'objet, par exemple, si vous souhaitez mettre à jour l' id de l'objet suivant sur "AAA", vous pouvez passer dans Categories.0.Products.1.id

  { "id": "a02", "name": "Pine", "description": "Short description of pine." } 

Alors l'objet deviendra

  { "id": "AAA", "name": "Pine", "description": "Short description of pine." } 

J'espère que cela peut éclairer!