De hecho, deseo convertir una cadena en un objeto profundo, pero estoy bastante seguro de que convertir la cadena en una matriz es el primer paso. Dejame explicar.
Estoy usando xeditable que, de forma predeterminada, se enviará {"name": "somePropertyName", "value": "someValue"}
al servidor, sin embargo, deseo enviar {"somePropertyName": "someValue"}
. Puedo lograr esto estableciendo $.fn.editable.defaults.params
la devolución de llamada adecuada.
Ahora la parte en la que estoy atrapado. Estoy usando un patrón de nomenclatura especial que si el nombre tiene puntos (es decir, el nombre es a.b.c
), no quiero enviarlo {"a.b.c": "someValue"}
al servidor, sino enviarlo {"a":{"b":{"c":"someValue"}}}
al servidor.
Tengo una versión que funciona parcialmente, sin embargo, no es muy elegante y, lo que es más importante, no he conseguido que funcione la última propiedad y la he codificado temporalmente, lo que no es aceptable.
¿Cómo se puede lograr esto?
$.fn.editable.defaults.params = function(params){
return nvp2obj(params.name, params.value);
}
function nvp2obj(n, v, d) {
d = d ? d : '.';
n = n.split('.');
var o = {};
var r = o;
n.reduce(function(total, currentValue, currentIndex, arr) {
if(r) {
r[currentValue]={};
r=o[currentValue];
}
else {
//this is obviously not correct
o.a.b.c=v;
}
return o;
}, o);
return o;
}
var test = nvp2obj('a.b.c', 'someValue'); //{"a":{"b":{"c":"someValue"}}}
console.log('test', JSON.stringify(test));
Puede iterar las claves dadas y asignar el valor tomando la última clave.
function setValue(object, keys, value) {
var last = keys.pop();
keys.reduce((o, k) => o[k] = o[k] || {}, object)[last] = value;
}
var test = {};
setValue(test, 'a.b.c'.split('.'), 'someValue');
setValue(test, 'a.d.e'.split('.'), 'someValue2');
setValue(test, 'a.b.a'.split('.'), 'someValue3');
console.log(test);
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras