Estoy tratando de actualizar un JSON anidado que se proporciona como entrada, por ejemplo:
{ "doc": { "a1": { "b1": 1, "b2": [ "one", "two" ] }, "a2": "xyz" } }La estructura JSON no se conoce.
El campo para actualizar es una cadena de entrada, por ejemplo: "doc.a2" o "doc.a1.b1" o "doc.a1.b2"
Además de la ruta, también se proporciona como entrada el valor anterior y un valor nuevo. Si el valor en la ruta coincide con el valor anterior, quiero actualizarlo con un valor nuevo.
Probé con eval() y parece posible que si la ruta es "doc.a1.b1", luego eval(doc['a1']['b1']='new value') ;
Pero el uso de eval puede generar problemas de seguridad. ¿Hay una mejor manera de lograr esto?
prueba esto
var input1 = "doc.a2"; val1 = "val1"; updateVal(obj, input1, val1); console.log("val1", obj); function updateVal(obj, input, val) { let props = input.split("."); let currObj = obj; let index = 0; for (index = 0; index < props.length - 1; index++) { currObj = currObj[props[index]]; }; currObj[props[index]] = val; };Suponiendo que no desea depender de una biblioteca de terceros, aquí hay una propuesta de 5 líneas (es posible que deba refinarse para abordar los casos extremos, como una ruta dada no válida, según cómo desee manejar esos casos, por ejemplo, error o crear el camino).
// given: /////////////////////////////////// const obj = { "doc": { "a1": { "b1": 1, "b2": [ "one", "two" ] }, "a2": "xyz" } } const str = "doc.a1.b2" const newValue = ["three"] // do: /////////////////////////////////////// const keys = str.split(".") let ptr = obj while(keys.length>1) ptr = ptr[keys.shift()] ptr[keys.shift()] = newValue // result: /////////////////////////////////// console.log(obj)