Como obtener el valor de un object de una ruta especifica Parte 2 - JavaScript
A ver chavos en la anterior publicacion vimos como lo obteniamos mediante un array al usar la funcion de get() en vanillajs, pero no se si se fijaron que tambien habia una opcion de una string (a[0].b.c)
Asi que ahi vamos, construyamos una nueva funcion con estas caracteristicas
Nosotros necesitamos convertir una string en una ruta para poder trabajar con esto, vamos a construir una funcion dentro de la funcion get() llamada stringToPath() y este aceptara el argumento path
var stringToPath = function (path) { // El Codigo estaria aqui
};
si el path no es una string, lo devolveremos como es, de lo contrario crearemos un
nuevo array llamado output en la que podremos poner nuevos items que cortaremos de la
string
var stringToPath = function (path) {
// Si el path no es una string cancela la funcion
if (typeof path !== 'string') return path;
// Crea un nuevo array
var output = [];
};
Lo siguiente que haremos es usar split() para convertir nuestra string en un array,
usando un punto como delimitador
Cada item es separado por un \\\\\".\\\\\", con split simplemente le pondremos ese delimitador
y listo verdad ? pues no, es mucho mas complicado de lo que parece, recuerda
que en el path estaran los [] para objects y arrays
var stringToPath = function (path) {
// Si el path no es una string devolverlo tal como esta
if (typeof path !== 'string') return path;
// Crear un array
var output = [];
// Cortar la string con el delimitador \\\\\".\\\\\"
path.split('.').forEach(function (item) {
console.log(item);
});
};
El codigo actual nos devolveria un array como este ['a[0]', 'b', 'c'] y tu te
preguntaras \\\\\"bueno y entonces en que esta mal?\\\\\" pues en el hecho de que 'a[0]'
deberia estar separado como ['a', 0], asi que para eso haremos lo siguiente
Usaremos la funcion split() de nuevo pero esta vez con un regex para cortar lo que
este dentro de los '[], si no hay ninguno se usara la string tal cual
finalmente podremos poner cada item en nuestro array y retornarlo
var stringToPath = function (path) {
// Si el path no es una string devolverlo tal cual
if (typeof path !== 'string') return path;
// Crear un nuevo array
var output = [];
// Cortar usando la funcion split('.')
path.split('.').forEach(function (item, index) {
// Cortar los corchetes del array
item.split(/\[([^}]+)\]/g).forEach(function (key) {
// Poner los items en el array final
if (key.length > 0) {
output.push(key);
}
});
});
return output;
};
Y finalmente el codigo quedaria asi
var get = function (obj, path, def) {
var stringToPath = function (path) {
if (typeof path !== 'string') return path;
var output = [];
path.split('.').forEach(function (item, index) {
item.split(/\[([^}]+)\]/g).forEach(function (key) {
if (key.length > 0) {
output.push(key);
}
});
});
return output;
};
path = stringToPath(path);
var current = obj;
for (var i = 0; i < path.length; i++) {
if (!current[path[i]]) return def;
current = current[path[i]]; } return current;
};
Bueno chavos eso es todo por la clase de hoy, espero les haya gustado y nos vemos en
el siguiente tutorial
Un momento mientras cargamos los comentarios
{{item.date}}
{{item.image}}
{{subitem.date}}
{{subitem.image}}