elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web (Moderador: #!drvy)
| | |-+  [Pregunta]: ¿Como puedo definir un arreglo de la siguiente manera con JS?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Pregunta]: ¿Como puedo definir un arreglo de la siguiente manera con JS?  (Leído 1,197 veces)
Leguim


Desconectado Desconectado

Mensajes: 694



Ver Perfil
[Pregunta]: ¿Como puedo definir un arreglo de la siguiente manera con JS?
« en: 18 Agosto 2020, 01:17 am »

Quiero que se pueda..

Código
  1. console.log(arreglo['texto']); // que imprima el valor 7
  2.  

traté de definir así..

Código
  1. var arreglo = ['texto' => 7];
  2.  

pero no funciona, si me funciona si hago así..

Código
  1. var arreglo = [];
  2. arreglo['texto'] = 7;
  3.  

pero quiero hacerlo de una manera más ordenada como la que mencioné más arriba de todo aunque no se si es posible...


En línea

@XSStringManolo
<svg/onload=alert()>
Colaborador
***
Desconectado Desconectado

Mensajes: 2.291


Turn off the red ligth


Ver Perfil WWW
Re: [Pregunta]: ¿Como puedo definir un arreglo de la siguiente manera con JS?
« Respuesta #1 en: 18 Agosto 2020, 02:56 am »

Con arreglo["texto"] estás accediendo a la propiedad(variable) texto de un objeto arreglo. Es decir, cualquiera de las múltiples formas que te permitan definir o modificar las propuedades o el objeto te sirven.

Código
  1. var arreglo = {};
  2. arreglo.texto = 7;

Código
  1. var arreglo = {};
  2. arreglo["texto"] = 7;

Código
  1. var a = "texto";
  2. var arreglo = {};
  3. arreglo[a] = 7;

Código
  1. var arreglo = {
  2.  texto: 7
  3. };

Obviamente arreglo no es un arreglo como tal. javascript no tiene soporte nativo a arrays multidimensionales, pero si puedes crear arrays de arrays:

Código
  1. var arreglo = [
  2.  ["texto", 7]
  3. ];

También tienes un montón de formas distintas de acceder a propiedades, valores, objetos, arrays... Varios for, .keys .entries... Etc.




En línea

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.718



Ver Perfil WWW
Re: [Pregunta]: ¿Como puedo definir un arreglo de la siguiente manera con JS?
« Respuesta #2 en: 19 Agosto 2020, 08:17 am »

Me imagino que tienes la confusión de los arrays en PHP.

En PHP un array puede tener keys de todo tipo, numéricos, string, null, etc.. En javascript los arrays solo pueden tener keys numéricos, si quieres usar string utilizas objetos tal y como te ha mostrado @XSStringManolo.


Saludos
En línea

Agente Naranja


Desconectado Desconectado

Mensajes: 530


uguu~


Ver Perfil WWW
Re: [Pregunta]: ¿Como puedo definir un arreglo de la siguiente manera con JS?
« Respuesta #3 en: 26 Agosto 2020, 08:31 am »

Me imagino que tienes la confusión de los arrays en PHP.

En PHP un array puede tener keys de todo tipo, numéricos, string, null, etc.. En javascript los arrays solo pueden tener keys numéricos, si quieres usar string utilizas objetos tal y como te ha mostrado @XSStringManolo.


Saludos


Que yo sepa, en JS también puedes tener un array con índices no numericos:



Eso sí, en el fondo los Arrays en javascript son objetos. En el caso original creo que podría hacer

const arreglo = { texto: 7};
console.log(arreglo['texto'])

Y por favor, estamos en 2020. DEJA DE USAR VAR PARA DECLARAR VARIABLES. Lo de ahora es const o let. Usando Var puedes tener problema con los "scopes", porque declara variables con un alcance de función, mientras que let/var declaran un alcance de bloque. Algo así.
En línea

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.718



Ver Perfil WWW
Re: [Pregunta]: ¿Como puedo definir un arreglo de la siguiente manera con JS?
« Respuesta #4 en: 26 Agosto 2020, 09:15 am »

Que yo sepa, en JS también puedes tener un array con índices no numericos:

Ahí lo que estas haciendo es acceder a las propiedades como objeto del array. Es como hacer trampa y los "indices" que seteas no funcionan como array.

https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Array

Arrays cannot use strings as element indexes (as in an associative array) but must use integers. Setting or accessing via non-integers using bracket notation (or dot notation) will not set or retrieve an element from the array list itself, but will set or access a variable associated with that array's object property collection. The array's object properties and list of array elements are separate, and the array's traversal and mutation operations cannot be applied to these named properties.


Una simple prueba:

Código
  1. let a = [];
  2. a['indice'] = 'hola';
  3. a['mundo'] = 'adios';
  4.  
  5. a.forEach(item => console.log(item)); //undefined
  6.  
  7. console.log(a.length); // 0
  8.  
  9. console.log(a.values()); // {}


Saludos
« Última modificación: 26 Agosto 2020, 09:19 am por #!drvy » En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.215


I'm fourth.


Ver Perfil WWW
Re: [Pregunta]: ¿Como puedo definir un arreglo de la siguiente manera con JS?
« Respuesta #5 en: 26 Agosto 2020, 16:45 pm »

Lo más similar a un arreglo asociativo de php en JS es un mapa. Si quieres imitar el comportamiento de inicialización de PHP lo podrías hacer con una función.

Código
  1. let patm = arr => new Map(arr.map((el, i) => Array.isArray(el) ? el : [i, el]));

Código
  1. let m = patm([
  2.    'lorem',
  3.    'ipsum',
  4.    ['text', 7]
  5. ]);

Para iterar:

Código
  1. m.forEach((el, k) => console.log(el, k));
  2. // 0 'lorem', 1 'ipsum', 'text' 7

También conservas las propiedades que menciona #!drvy

Código
  1. console.log(m.size) //3
  2. console.log([...m.values()]) // ['lorem', 'ipsum', 7]

Lo que no vas a poder hacer es acceder a las propiedades ni siquiera con notación de corchetes.

Código
  1. m[0] = 'test'; //escribe 'test' en la propiedad 0 del objeto del mapa, pero los elementos
  2.               //del objeto no son parte del objeto del mapa.
  3. m[1];          //La propiedad 1 del objeto del mapa no es el elemento del mapa al que corresponde la llave 1
  4. m['text'];     //Lo mismo de arriba.

Si quieres cambiar esos elementos tienes que usar Map.prototype.get y Map.prototype.set:

Código
  1. m.set(0, 'nuevo valor');
  2. console.log(m.get(0)); //'nuevo valor'

Podrías emular ese comportamiento con un Proxy, pero yo no lo haría. Perderías la posibilidad de tener llaves como forEach, size, values, entries, etc. Sin mencionar que los Proxies son mucho más lentos.

Por otro lado, puedes optar simplemente por un objeto normal:

Código
  1. let obj = {
  2.    0 : 'lorem',
  3.    1 : 'ipsum',
  4.    'text' : 7
  5. };

Y también puedes iterar esas propiedades con Object.values, Object.entries y Object.keys. Pero ojo, a diferencia de PHP y los mapas el orden no está exactamente "garantizado" y no es por orden de inserción. Hasta donde tengo entendido, la especificación no había aclarado un orden al cual todas las implementaciones pudieran llegar de una manera determinista hasta hace poco. Generalmente, las implementaciones se comportan de manera muy similar (al menos en sus últimas versiones).

También puede ser un arreglo:

Código
  1. let a = ['lorem', 'ipsum'];
  2. a['text'] = 7;
  3.  
  4. console.log(Object.values(a));

Pero ya esto a mi me sabe muy mal.

En mi opinión me quedaba con los mapas de javascript.
En línea

@XSStringManolo
<svg/onload=alert()>
Colaborador
***
Desconectado Desconectado

Mensajes: 2.291


Turn off the red ligth


Ver Perfil WWW
Re: [Pregunta]: ¿Como puedo definir un arreglo de la siguiente manera con JS?
« Respuesta #6 en: 27 Agosto 2020, 03:18 am »

Y por favor, estamos en 2020. DEJA DE USAR VAR PARA DECLARAR VARIABLES. Lo de ahora es const o let. Usando Var puedes tener problema con los "scopes", porque declara variables con un alcance de función, mientras que let/var declaran un alcance de bloque. Algo así.
Puedes tener problemas si no tienes ni idea de que haces. El alcance de var depende del contexto de ejecución. Si está dentro de una función, tiene alcance local en esa función. Con bucles for pasa lo mismo. En el resto de casos el alcance es global y por tanto se define una propiedad en el objeto global/window.

Teniendo esto en cuenta, usar var en una IIFE o en un módulo es seguro porque no contaminas el objeto global. La única propiedad definida es el identificador de la propia IIFE si no es anónima o el identificador del objeto/módulo.
En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.215


I'm fourth.


Ver Perfil WWW
Re: [Pregunta]: ¿Como puedo definir un arreglo de la siguiente manera con JS?
« Respuesta #7 en: 27 Agosto 2020, 04:11 am »

El alcance de var depende del contexto de ejecución. Si está dentro de una función, tiene alcance local en esa función. Con bucles for pasa lo mismo.

Si por lo mismo te refieres a que el alcance sigue siendo local a la función y no al bucle entonces eso es correcto. Las variables definidas con var no tienen ningún alcance localizado a ninguna estructura de control.

Teniendo esto en cuenta, usar var en una IIFE o en un módulo es seguro porque no contaminas el objeto global. La única propiedad definida es el identificador de la propia IIFE si no es anónima o el identificador del objeto/módulo.

let y const sirven para mucho más... No tiene sentido declarar variables dentro de una estructura de control con var, las podrías poner todas al tope de tu función y no habría ninguna diferencia. Técnicamente, una IIFE con nombre es realmente una IINFE (Immediately Invoked Named Function Expression) y el nombre es local a la función y no es visible desde el contexto en el la expresión fue creada.

Código
  1. (function named() {
  2.   console.log(named); //la funcion
  3. })();
  4.  
  5. console.log(window.named == undefined) //true
  6. console.log(named); //ReferenceError
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines