Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: bengy en 17 Septiembre 2016, 03:08 am



Título: convertir un array en Map en javascript
Publicado por: bengy en 17 Septiembre 2016, 03:08 am
quiero convertir un arreglo a Map()
este arreglo lo uso para ejemplo, en este console
"console.log(arrayParaMap);" sale undefined
el ejemplo que uso es este //example {a:1,a:2,a:1,b:1,b:5,b:6}
el map que prentendo obtener es [a,{1,2,1}
                                               b,{1,5,6}]

este es mi codigo
Código
  1. var revisados=[];
  2. var mapita=new Map();
  3. var fabrica =function(array){ //input array -  output map
  4. for (var i = 0; i < array.length; i++) {
  5. var arreglo1=array[i].split(":");
  6. var arrayParaMap=[];
  7. for (var j = 0; j < array.length; j++) {
  8. var arreglo2=array[j].split(":");
  9. if(!db(arreglo1[0])){
  10. if(arreglo1[0]==arreglo2[0]){
  11. arrayParaMap.push(arreglo2[2]);
  12. console.log(arrayParaMap);
  13. }
  14. }
  15.  
  16. };
  17. mapita.set(arreglo1[0],arrayParaMap);
  18. revisados.push(arreglo1[0]);
  19. };
  20. for (var key of mapita.keys()) {
  21.   console.log(key);
  22. }
  23. for (var value of mapita.values()) {
  24.   // for (var i = 0; i < value.length; i++) {
  25.   console.log(value);
  26.   // };
  27.  
  28. }
  29. }
  30. var db=function(data){
  31. for (var i = 0; i < revisados.length; i++) {
  32. if(revisados[i]==data){
  33. return true;
  34. }
  35. };
  36. return false;
  37. }
  38.  
  39. //example {a:1,a:2,a:1,b:1,b:5,b:6}
  40. var arregloPrueba=["a:1","a:2","a:1","b:1","b:5","b:6"];
  41. fabrica(arregloPrueba);

en que estoy fallando?


Título: Re: convertir un array en Map en javascript
Publicado por: Jeferi en 17 Septiembre 2016, 03:17 am
¿Te refieres a un array, verdad?

Es decir:
Código
  1. var example = [{a:1}, {a:2}, {a:3}, {b:1}, {b:2}]

Te lo comento porque un objeto:
Código
  1. var example = {a:1,a:2,a:3,b:1,b:2}
Si muestras example resultaría
Código
  1. {a:3,b:2}

Lo que quieres obtener es:
Código
  1. {a:[1,2,3],b:[1,2]}


Título: Re: convertir un array en Map en javascript
Publicado por: bengy en 17 Septiembre 2016, 03:37 am
si tengo un array
Código:
[{a:1}, {a:2}, {a:3}, {b:1}, {b:2}]
y quiero
Código:
{a:[1,2,3],b:[1,2]} // el cual es un Map


Título: Re: convertir un array en Map en javascript
Publicado por: Jeferi en 17 Septiembre 2016, 03:52 am
si tengo un array
Código:
[{a:1}, {a:2}, {a:3}, {b:1}, {b:2}]
y quiero
Código:
{a:[1,2,3],b:[1,2]} // el cual es un Map

Haciendo uso de los nuevos métodos para arrays de ES6 lo tienes fácil y te olvidas de tanto bucle for. (Tener en cuenta que NodeJS ya acepta más del 90% de las características de ES6)
Voy a utilizar el método Array.reduce de la nueva especificación.

Código
  1. const obj = [{a:1}, {a:2}, {a:3}, {b:1}, {b:2}];
  2.  
  3. const objMapped = obj.reduce((array, item) => {
  4.  let arr = [];
  5.  
  6.  for (let i of Object.keys(item))
  7.  {
  8.    if (!array[i])
  9.      array[i] = [];
  10.  
  11.    array[i].push(item[i]);
  12.    return array;
  13.  }
  14. }, []);
  15.  
  16. console.log(objMapped);

objMapped contiene el nuevo array

Te muestro el resultado en mi máquina:
Código
  1. $ node elhacker-net.js
  2. [ a: [ 1, 2, 3 ], b: [ 1, 2 ] ]

-

Edito:

Hice otro ejemplo, un poco más acorde a ES6, olvidando Array.push de la línea 11
Código
  1. const obj = [{a:1}, {a:2}, {a:3}, {b:1}, {b:2}];
  2.  
  3. const objMapped = obj.reduce((array, item) => {
  4.  let arr = [];
  5.  
  6.  for (let i of Object.keys(item))
  7.  {
  8.    if (!array[i])
  9.      array[i] = [];
  10.  
  11.    array[i] = [...array[i], item[i]];
  12.    return array;
  13.  }
  14. }, []);
  15.  
  16. console.log(objMapped);
  17.  

Para aprender más, puedes encontrar información en MDN (https://developer.mozilla.org/es/) acerca de ES6.


Título: Re: convertir un array en Map en javascript
Publicado por: bengy en 17 Septiembre 2016, 04:02 am
del primer ejemplo, todos los "let" lo cambie por var y funciono

y del segundo no reconoce
Citar
array = [...array, item];


Título: Re: convertir un array en Map en javascript
Publicado por: Jeferi en 17 Septiembre 2016, 04:09 am
del primer ejemplo, todos los "let" lo cambie por var y funciono

y del segundo no reconoce

Pensaba que lo ejecutabas sobre NodeJS. Fallo mío.
Hay algunos navegadores que aún no reconocen la nueva sintáxis (aunque deberían).

Usa el primero si el segundo no te ha funcionado.


Título: Re: convertir un array en Map en javascript
Publicado por: bengy en 17 Septiembre 2016, 04:14 am
lo uso sobre nodejs, (https://s16.postimg.org/sof8ac9qd/Sin_t_tulo.png) (https://postimg.org/image/euqvlah4x/)imag (https://postimage.org/index.php?lang=spanish)

cual sera el problema(solo por curiosidad)


Título: Re: convertir un array en Map en javascript
Publicado por: Jeferi en 17 Septiembre 2016, 04:16 am
Ejecuta node --version y postea el resultado.


Título: Re: convertir un array en Map en javascript
Publicado por: bengy en 17 Septiembre 2016, 04:19 am
la version es v4.5.0


Título: Re: convertir un array en Map en javascript
Publicado por: Jeferi en 17 Septiembre 2016, 04:24 am
la version es v4.5.0

Claro. Fíjate que la versión 4.5.0 de Node no soporta "spread operator (...)"

(https://s17.postimg.org/cat50ntcf/img.png)

Fuente: https://kangax.github.io/compat-table/es6/

Actualiza a la versión 6 si no es un problema para tí.


Título: Re: convertir un array en Map en javascript
Publicado por: bengy en 17 Septiembre 2016, 04:26 am
gracias, ya vere si lo actualizo y si no tengo algun problema luego de hacerlo
 :laugh: :laugh: :laugh:


Título: Re: convertir un array en Map en javascript
Publicado por: bengy en 17 Septiembre 2016, 15:19 pm
si en vez de esto:
Citar
[{a:1}, {a:2}, {a:3}, {b:1}, {b:2}]

tengo :
Código:
function claves(id, time) {
    this.id = id;
    this.time = time;
}
Código:
key_cadaTecla.push(new claves(event.keyCode,tiempoPulsacion));

es decir tendria
Código:
[ObjetoClaves(a:1),ObjetoClaves(a:2), ObjetoClaves(a:3), ObjetoClaves(b:1), ObjetoClaves(b:2)]
este es el codigo que me pasaste
Citar
const obj = [{a:1}, {a:2}, {a:3}, {b:1}, {b:2}];
 
const objMapped = obj.reduce((array, item) => {
  let arr = [];
 
  for (let i of Object.keys(item))
  {
    if (!array)
      array = [];
 
    array.push(item);
    return array;
  }
}, []);
 
console.log(objMapped);

intente modificar el codigo pero no funciona



Título: Re: convertir un array en Map en javascript
Publicado por: Jeferi en 17 Septiembre 2016, 16:37 pm
tengo :
Código:
function claves(id, time) {
    this.id = id;
    this.time = time;
}
Código:
key_cadaTecla.push(new claves(event.keyCode,tiempoPulsacion));

Tendrías:
Código
  1. [{id: a, time: 1}, {id: a, time: 2}, {id: b, time: 1}]

Para este objeto debes modificar el código a:
Código
  1. const obj = [{id: 'a', time: 1}, {id: 'a', time: 2}, {id: 'b', time: 1}];
  2.  
  3. const objMapped = obj.reduce((array, item) => {
  4.  let { id, time } = item;
  5.  
  6.  if (!array[id])
  7.    array[id] = [];
  8.  
  9.  array[id].push(time);
  10.  return array;
  11.  
  12. }, []);
  13.  
  14. console.log(objMapped);


Título: Re: convertir un array en Map en javascript
Publicado por: MinusFour en 17 Septiembre 2016, 20:26 pm
Tendrías:
Código
  1. [{id: a, time: 1}, {id: a, time: 2}, {id: b, time: 1}]

Para este objeto debes modificar el código a:

Se espera un objeto y no un arrreglo al final creo yo.

Código
  1. const obj = [{id: 'a', time: 1}, {id: 'a', time: 2}, {id: 'b', time: 1}];
  2.  
  3. const objMapped = obj.reduce((acc, item) => {
  4.  let { id, time } = item;
  5.  acc[id] = acc[id] || [];
  6.  acc[id].push(time);
  7.  return acc;
  8. }, {});
  9.  
  10. console.log(objMapped);


Título: Re: convertir un array en Map en javascript
Publicado por: Jeferi en 17 Septiembre 2016, 21:55 pm
Se espera un objeto y no un arrreglo al final creo yo.

Sí .Debe inicializar un objeto y no un array, en el initialValue de reduce (último parámetro)


Título: Re: convertir un array en Map en javascript
Publicado por: bengy en 19 Septiembre 2016, 05:41 am
he instalado la ultima version de nodejs y mi proyecto dejo de funcionar
sale este error Node v6.3 return process.dlopen(module, path._makeLong(filename));
que hago?

bueno tuve que crear otro proyecto y copie las dependencias del archivo package.json de mi anterior proyecto y luego le di "npm install", pero instalo muchas cosas que no pedi, entre ellas las que necesito, pero hay muchos modulos que no utilizare

miren aca una foto
(https://s10.postimg.org/w6utcwudl/Sin_t_tulo.png) (https://postimg.org/image/lwsedo4hx/)subefotos (https://postimage.org/index.php?lang=spanish)

es normal?

ahora tengo otra pregunta mas, el codigo que postearon funciona para este  array:
Citar
[{id: a, time: 1}, {id: a, time: 2}, {id: b, time: 1}]


yo necesito para este array
Código:
[{"id":65,"time":98},{"id":83,"time":170}]

cuando intento acoplar la funcion con el array de arriba no funciona asi:
Código
  1. var fabricar=function(obj){
  2.  
  3.  
  4. const objMapped = obj.reduce((acc, item) => {
  5.  let { id, time } = item;
  6.  acc[id] = acc[id] || [];
  7.  acc[id].push(time);
  8.  return acc;
  9. }, {});
  10.  
  11. console.log(objMapped);
  12. }
  13.  
  14. exports.fabricar=fabricar;
el codigo:


Título: Re: convertir un array en Map en javascript
Publicado por: bengy en 19 Septiembre 2016, 17:26 pm
no funcionara ?  no se podra refactorizar? por mas que intento no funciona


Título: Re: convertir un array en Map en javascript
Publicado por: MinusFour en 19 Septiembre 2016, 17:45 pm
Lo mas probable es que quieras que fabricar regrese el arreglo mapeado y no solo hacer el console.log.


Título: Re: convertir un array en Map en javascript
Publicado por: bengy en 19 Septiembre 2016, 18:06 pm
si porque necesito el Map, pero quiero ir por pasos, primero me conformaria solo con el console.log

gracias y saludos...


Título: Re: convertir un array en Map en javascript
Publicado por: MinusFour en 19 Septiembre 2016, 18:54 pm
A mi me funciona tal cual. Tu arreglo probablemente no sea ese o no estes usando el modulo correctamente.


Título: Re: convertir un array en Map en javascript
Publicado por: bengy en 19 Septiembre 2016, 19:31 pm
si tienes razon la funcion esta bien, el problema es la exportacion e importacion de la funcion, mira en el app estoy importando el archivo fabrica asi:

Código:
var ror2 = require('./node_modules/node-svm/sample/fabrica');

y lo uso asi

Código:
app.post('/servidor', function(req,res){
    
    console.log(req.body.fact);// imprime bien el array [{"id":65,"time":98},{"id":83,"time":170}]
    ror2.fabricar(req.body.fact);
    
});

mi archivo fabrica tiene la funcion de arriba
Código
  1. var fabricar=function(obj){
  2. // const obj = [{id: 'a', time: 1}, {id: 'a', time: 2}, {id: 'b', time: 1}];
  3. console.log(obj);// muestra el array que mando
  4. const objMapped = obj.reduce((acc, item) => {
  5.  let { id, time } = item;
  6.  acc[id] = acc[id] || [];
  7.  acc[id].push(time);
  8.  return acc;
  9. }, []);
  10.  
  11. console.log(objMapped);
  12. }
  13.  
  14. exports.fabricar=fabricar;

el array que mando se muestra y luego falla , hasta "console.log(obj);// muestra el array que mando" todo bien.


Título: Re: convertir un array en Map en javascript
Publicado por: bengy en 20 Septiembre 2016, 02:32 am
aqui no entra,  lo puse un console.log en medio de esa funcion y no muestra nada

Código:
const objMapped = obj.reduce((acc, item) => {
  let { id, time } = item;
  acc[id] = acc[id] || [];
  acc[id].push(time);
  return acc;
}, []);


Título: Re: convertir un array en Map en javascript
Publicado por: MinusFour en 20 Septiembre 2016, 03:58 am
¿Cual es el error exactamente? Lo único que se me ocurre es que estes haciendo algo como:

Código
  1. exports.fabricar = fabricar;
  2. module.exports = {}; //o
  3. exports.fabricar = {}; //o alguna otra cosa


Título: Re: convertir un array en Map en javascript
Publicado por: bengy en 20 Septiembre 2016, 05:24 am
no se cual sea el error, y si estoy haciendo "exports.fabricar = fabricar;" pero cuando envio desde el archivo principal llamado app.js llega  y lo muestro
Código:
var fabricar=function(obj){
// const obj = [{id: 'a', time: 1}, {id: 'a', time: 2}, {id: 'b', time: 1}];
console.log(obj);// muestra el array que mando

pero esta parte ya no termina
Código:
const objMapped = obj.reduce((acc, item) => {
  let { id, time } = item;
  acc[id] = acc[id] || [];
  acc[id].push(time);
  return acc;
}, []);
 
console.log(objMapped);
}

pero cuando lo mando un array estatico por ejemplo asi:
Código:
ror2.fabricar([{"id":65,"time":98},{"id":83,"time":170}]);
funciona al 100%


Título: Re: convertir un array en Map en javascript
Publicado por: bengy en 20 Septiembre 2016, 06:25 am
encontre el error, no estoy enviando array. me explico, lo estoy pasando desde ajax asi:data: { fact: JSON.stringify(key_cadaTecla)}, y ahi deja de ser array se convierte .json, mi pregunta es como convertirlo en array?, modificando, lo solucione asi var json = '{"0":"1","1":"2","2":"3","3":"4"}'; var parsed = JSON.parse(json); var arr = []; for(var x in parsed){ arr.push(parsed
  • ); }


Título: Re: convertir un array en Map en javascript
Publicado por: MinusFour en 20 Septiembre 2016, 15:17 pm
Lo ideal es que envies con el contentType: "application/json" y tengas un parser para express (como body-parser). Así el string es convertido a un arreglo.


Título: Re: convertir un array en Map en javascript
Publicado por: bengy en 20 Septiembre 2016, 16:02 pm
lo probare gracias!!!
y luego comento si funciono!!! estas en lo correcto si funciona!!!

ahora tengo otra pregunta como recorro/iterar el objeto ?

Citar
const obj = [{id: 'a', time: 1}, {id: 'a', time: 2}, {id: 'b', time: 1}];
 
const objMapped = obj.reduce((acc, item) => {
  let { id, time } = item;
  acc[id] = acc[id] || [];
  acc[id].push(time);
  return acc;
}, {});
 
console.log(objMapped);

vi que se puede iterar por sus keys:
Código:
Object.keys(obj).forEach(key => {
  let value = obj[key]
})