entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

4votos

como manipular los items de un array

tengo un problema que no puedo resolver, lo explico lo mas claro posible para que lo puedan entender.
tengo dos paginas en la primera tengo un array donde almaceno valores numericos, estos son enviados por medio de unos botones, ej. botton onclick=agregar_item(10)
surge un incoveniente cuando quiero enviar esos valores a mi segunda pagina pero es resolvible haciendo uso de la webstorage en mi caso utilizo sessionstorage porque quiero que mi array permanezca vivo, de este modo lo puedo llamar en mi segunda pagina.
es aqui donde surge el problema, el unico tipo de dato que puede almacenar en sesion son cadenas, entonces mi idea fue convertir mi array en una cadena con la funcion
toString, luego en mi segunda pagina lo recupero y con la funcion split recupero mi array, es aqui mi problema, split convierte mi array de numeros en un array de cadenas
por lo que si antes mi array numerico era [10,20,30] pasa a ser ["10","20","30"]

1 Respuesta

2votos

magarzon Puntos30650

Usa JSON.stringify() cuando vayas a guardarlo y JSON.parse() cuando vayas a recuperarlo.

Por ejemplo:

var test = [10,20,30];

//Guardar
sessionStorage.test = JSON.stringify(test);

//Recuperar

var test2 = JSON.parse(sessionStorage.test);

1voto

steven comentado

gracias @magarzon, mientras esperaba una respuesta pense a otra solucion
convertir las cadenas de numeros en tales con la funcion number de la siguiente manera Number(test), es una funcion primitiva que puede retornar util en algunos casos.
ahora mismo tengo otro problema correlacionado, tengo un array que contiene distintos tipos de datos, mi intencion es filtrar las cadenas y guardarlo en una variable.
arraymixto = ['lucho', 'pepe', 12, 14, objeto];
he probado con la funcion filter : arraymixto.filter(String);
pero este devuelve todo el array, cual seria la manera correcta de hacerlo??
si fuese posible me gustaria poder filtrar cualquier tipo de dato

2votos

magarzon comentado

Tener que recorrer el array para reconvertir a número es menos eficiente que la solución que te he dado, además de que no estás convirtiendo a un tipo de dato primitivo (integer), si no a un objeto de tipo Number, y no es lo mismo.

Por otro lado, en respuesta a tu segundo problema, puedes utilizar filter así:

arraymixto.filter(function(item) {return typeof item === 'string' || item instanceof String;});

Aunque tampoco veo muy normal tener un array que guarde elementos de diferente tipo, no suele ser algo de buenas prácticas.

0voto

steven comentado

el codigo para filtrar los strings de mi array devuelve un array vacio

arraymixto = ['lucho', 'pepe', 12, 14];
["lucho", "pepe", 12, 14]
arraymixto.filter(function(item){return item instanceof String})
[]

hay algunas cosas que no entendi bien, cual es la diferencia entre numeros enteros y los objetos de tipo number?, la funcioon instanceof es nueva para mi, podrias explicarme para que sirve realmente?

0voto

steven comentado

el codigo devuelve un array vacio, lo acabo de probar en la consola, seguro me equivoque en algo o no lo entendi bien si debo pasar parametros a la funcion.
aparte esto me queda la duda de la diferencia entre numeros primitivos y objetos de tipo number, por otro lado me es nuevo la funcion instanceof, no tengo una idea ien clara aunque supongo que se trata solo de instanciar, prodrias darme una breve explicacion,

0voto

magarzon comentado

Disculpa, me faltó una cosa en la función, la que te pasé solo sirve para objetos String, no para tipos primitivos. He modificado la respuesta para que veas la respuesta correcta y que sí funciona.

En cuanto al operador instanceof, comprueba si un objeto es de un determinado tipo (clase), pero no sirve para tipos primitivos (ahí estaba el fallo).

La función typeof te devuelve una cadena con el "nombre" del tipo, y esta sí que sirve para tipos primitivos (y viceversa, para objetos no te va a servir salvo casos específicos)

La diferencia entre usar Number o usar un número entero (y también entre usar String o una cadena), es que en el primer caso es un objeto, que encapsula un valor numérico y que tiene una serie de métodos para manejar ese valor numérico. En el segundo caso, es un tipo primitivo, no es un objeto y por tanto no tiene métodos. Si no vas a necesitar ninguno de los métodos que te aporta Number, en general es mejor usar tipos primitivos, son más eficientes.

0voto

steven comentado

antes de todo muchas gracias, antes de publicar esta pregunta tenia en mente algo parecido para filtrar las cadenas, pero yo lo hacia de esta manera
arraymixto.filter(typeof="string")
volviendo al tema, lo que pude entender, si es que no entendi mal es que los tipos primitivos como enteros,cadenas y numeros, pueden ser tambien objetos o se podrian convertir, desde este punto pueden ser manipulados como objetos.

pero desde cuando pasan a ser objetos, como los puedo reconocer
Por ultimo he visto que hay mas metodos para trabajar con arrays como lo son
find,every,some,ecc, conoces algunos de estos? personalmente estoy interesado en aprenderlas pero por la red no hay muchos ejemplos claros, todos se basan en teorias.
para terminar existen metodos para trabajar con objetos como los hay con arrays

1voto

magarzon comentado

Por partes:
El método filter tiene como argumento una función (callback). Si pones typeof="string" eso no es una función, pero incluso en el caso de que el método filter aceptara expresiones, aquí estarías asignando (has usado un solo =) o como mucho comparando (si usaras ==) una variable con nombre typeof (que no está definida) con "string".

Los tipos primitivos se puede convertir a objetos, y normalmente los operadores (por ejemplo +, -) están preparados para trabajar tanto con tipos primitivos como con objetos, por lo que por lo general no tendrás que preocuparte mucho por saber si son objetos o tipos primitivos, pero si quieres hacerlo, se hace como te he indicado, con typeof y instanceof.

Los métodos que tiene un array en javascript están perfectamente definidos, no hay nada teórico, puedes consultarlos aquí: https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Array

De todas formas, yo suelo utilizar lodash, una librería que te ofrece muchísimas opciones para trabajar con arrays, strings y más cosas.

En cuanto a los métodos para trabajar con objetos... pues depende de qué clase sea el objeto, porque la clase es la que define qué metodos pueden aplicarse a un objeto, teniendo por otra parte javascript la peculiaridad de que puedes extender o añadir métodos y campos a una clase u objeto en tiempo de ejecución.

1voto

steven comentado

resumiendo todo, los metodos para los arrays que mencione solo aceptan funciones con callbacks(no me quedo claro esto del callback, cual es la diferencia entre una funcion normal con argumentos)
aparte esto se que hay funciones que cuando terminan pasan a otras funciones
lo he visto en un articulo de nodejs, creo que se llama funciones asincronas estan relacionadas con un termino thread que creo que se trate de la memoria

regresando al tema de los metodos, lastima que no acepten expresiones, seria todo mas sencillo y eficiente.

luego para terminar, distinguir entre un objeto y un tipo primitivo es cuestion de utilizar la funcion typeof y instanceof(esta funcion no devuelve ningun valor)

1voto

magarzon comentado

No te líes.

callback es, en este caso, simplemente una función que es pasada como argumento a otra función (en este caso la función filter) para que sea llamada en determinadas condiciones y con unos argumentos definidos.

No te líes con nodejs, funcionas asíncronas y threads si todavía no manejas los conceptos básicos de programación y/o javascript, porque te vas confundir más.

Aunque no lo creas, es más sencillo y eficiente que determinados métodos acepten callbacks y no expresiones. De todas formas, puedes construir funciones que acepten "expresiones", pero te tienes que construir también tu analizador de expresiones. Lodash, la librería que te recomendé antes, en cierto modo tiene algo parecido.

Y por aclarar, typeof e instanceof no son funciones, son operadores, como pueden serlo el + o el -, dado 1 valor (en el caso de typeof) o dos (en el caso de instanceof) te devuelve un resultado (una cadena con el tipo en el caso de typeof, un true o false en el caso de instanceof). Si bien es verdad que typeof también podría ser considerado una función (de hecho se le puede llamar con paréntesis)

1voto

steven comentado

como es de complicada la programacion, cuando crees haber entendido una cosa que aparecen otras cosas y pareciera que nunca lo entenderas por completo
bueno creo que es solo cuestion de interpretacion para no perderse en el camino, a proposito de lodash me parece un proyecto genial ,pero requiere un conocimiento avanzado, por lo que todavia no esta a mi alcanze, ademas toda la documentacion esta en ingles y no hay muchos videotutos.

es increible la cantidad de librerias que hay por la red y a la vez extrano que no exista ninguno en lingua hispana.

me gustaria poder charlar contigo mas seguido, te saludo hasta la proxima pregunta

1voto

magarzon comentado

La programación es un campo que requiere autoformación constante.

Yo llevo más de 20 años en esto, he aprendido/utilizado unos 10 lenguajes diferentes y otras tantas tecnologías asociadas (bases de datos, sistemas de mensajería...) y todavía no hay día que no aprenda algo nuevo.

Eso sí, lo mejor es tener una buena base, y a ser posible, saber inglés, porque la mayor parte de la documentación, y sobre todo de la buena documentación, va a estar exclusivamente en inglés.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta