He escrito una solución diferente, utilizando recursividad. Estaba usando esto para nombrar el nombre del atributo de los elementos de entrada. Tome, por ejemplo, lo siguiente:
<input type="number" name="testGroup.person.age" />
Y digamos que establecemos el valor de esa entrada en "25". También tenemos un objeto en nuestro código en algún lugar:
var data = {
testGroup: {
person: {
name: null,
age: null,
salary: null
}
}
};
lo tanto, el objetivo aquí es poner automáticamente el valor en nuestro elemento de entrada en la posición correcta en esa estructura de datos.
que he escrito esta pequeña función para crear un objeto anidado basado en lo que sea gran variedad de espacios de nombres que pase a ella:
var buildObject = function (obj, namespaceArray, pos) {
var output = {};
output[namespaceArray[pos]] = obj;
if (pos > 0) {
output = buildObject(output, namespaceArray, pos-1);
}
return output;
};
¿Cómo funciona? Comienza al final de la matriz namespaceArray
y crea un objeto con una propiedad, cuyo nombre es el que se encuentre en la última ranura en namespaceArray
, y cuyo valor sea obj
.Luego se repite, envolviendo ese objeto en objetos adicionales hasta que se quede sin nombres en namespaceArray
. pos
es la longitud de la matriz namespaceArray
. Podrías resolverlo en la primera llamada a la función, algo así como if (typeof(pos) === "undefined") pos = namespaceArray.length - 1
, pero luego tendrías una declaración extra para evaluar cada vez que recursara la función.
primer lugar, se dividió el atributo name
del input
en una matriz alrededor de los separadores de espacio de nombres y obtener el valor de la entrada:
var namespaceArray = inputElement.name.split("."),
obj = inputElement.value;
// Usually you'll want to do some undefined checks and whatnot as well
Entonces sólo llamamos nuestra función y asignar el resultado a una variable:
var myObj = buildObject(obj, namespaceArray, namespaceArray.length - 1);
myObj ahora se verá así:
{
testGroup: {
person: {
age: 25
}
}
}
En este punto utilizo función de extensión de jQuery para fusionar esa estructura de nuevo en el objeto de datos original:
data = $.extend(true, data, myObj);
Sin embargo, la fusión de dos objetos no es muy difícil de hacer en-marco libre de JavaScript y hay un montón de existing code eso hace bien el trabajo.
Estoy seguro de que hay formas más eficientes de hacerlo, pero este método satisface mis necesidades.
@Tim esto es lo que estaba pensando, ¡pero lo tienes antes que yo! :) –
¬¬ ¿Lo tienes primero? :(haha +1 – JCOC611
@TimDown mencionan cómo usar espacios de nombre como este no es realmente compatible de forma nativa y puede llevar a que el código se vuelva bastante complicado y difícil de mantener. Se siente como alguien que transfiere estilos de otros idiomas a JavaScript cuando hay mejores alternativas. – Raynos