recorrer objetos objeto eliminar elemento dinamicas crear buscar array alternativa agregar javascript object deep

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

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/