objetos - Configuración profunda dinámica para un objeto JavaScript
recorrer objeto json javascript (3)
Aquí hay una solución completa.
También crea objetos si no existen.
function setValue(object, path, value) {
var a = path.split(''.'');
var o = object;
for (var i = 0; i < a.length - 1; i++) {
var n = a[i];
if (n in o) {
o = o[n];
} else {
o[n] = {};
o = o[n];
}
}
o[a[a.length - 1]] = value;
}
function getValue(object, path) {
var o = object;
path = path.replace(//[(/w+)/]/g, ''.$1'');
path = path.replace(/^/./, '''');
var a = path.split(''.'');
while (a.length) {
var n = a.shift();
if (n in o) {
o = o[n];
} else {
return;
}
}
return o;
}
Esta pregunta ya tiene una respuesta aquí:
Dada una cadena para una ruta de propiedad de objetos, ¿cómo configuro esta propiedad dinámicamente?
Dado este objeto de muestra:
var obj = {
a: {
b: [ { c: ''Before'' } ]
}
};
Debería poder establecer el valor con una función auxiliar como esta:
setToValue(obj, ''After'', ''a.b.0.c'');
Lo intenté con el siguiente código. Pero parent es una copia si la variable no es una referencia.
function setToValue(obj, value, path) {
var arrPath = path.split(''.''),
parent = obj;
for (var i = 0, max = arrPath.length; i < max; i++) {
parent = parent[arrPath[i]];
}
parent = value;
}
FWIW, aquellos de ustedes que deseen lo mismo en CoffeeScript pueden encontrar estos métodos a mano: es un puerto bastante directo del código anterior. Como un beneficio adicional, se aseguran de que todos los objetos en el camino existe (el getPropertyByPath no lanza excepciones si no lo hacen, y el método conjunto crearán objetos vacíos si hay objetos en el camino de pasar a ser nulo).
getPropertyByPath: (obj, path) ->
path = path.split(''.'')
parent = obj
if path.length > 1
parent = parent[path[i]] for i in [0..path.length - 2]
parent?[path[path.length - 1]]
setPropertyByPath: (obj, path, value) ->
path = path.split(''.'')
parent = obj
if path.length > 1
parent = (parent[path[i]] ||= {}) for i in [0..path.length - 2]
parent[path[path.length - 1]] = value
a) ¿Qué pasa con un simple ab [0] .c = ''Después''?
En cuanto al método:
function setToValue(obj, value, path) {
var i;
path = path.split(''.'');
for (i = 0; i < path.length - 1; i++)
obj = obj[path[i]];
obj[path[i]] = value;
}
Aquí el JSFiddle: http://jsfiddle.net/QycBz/24/