convertir un array en Map en javascript

Iniciado por .rn3w., 17 Septiembre 2016, 03:08 AM

0 Miembros y 1 Visitante están viendo este tema.

.rn3w.

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 (javascript) [Seleccionar]
var revisados=[];
var mapita=new Map();
var fabrica =function(array){ //input array -  output map
for (var i = 0; i < array.length; i++) {
var arreglo1=array[i].split(":");
var arrayParaMap=[];
for (var j = 0; j < array.length; j++) {
var arreglo2=array[j].split(":");
if(!db(arreglo1[0])){
if(arreglo1[0]==arreglo2[0]){
arrayParaMap.push(arreglo2[2]);
console.log(arrayParaMap);
}
}

};
mapita.set(arreglo1[0],arrayParaMap);
revisados.push(arreglo1[0]);
};
for (var key of mapita.keys()) {
  console.log(key);
}
for (var value of mapita.values()) {
  // for (var i = 0; i < value.length; i++) {
  console.log(value);
  // };
 
}
}
var db=function(data){
for (var i = 0; i < revisados.length; i++) {
if(revisados[i]==data){
return true;
}
};
return false;
}

//example {a:1,a:2,a:1,b:1,b:5,b:6}
var arregloPrueba=["a:1","a:2","a:1","b:1","b:5","b:6"];
fabrica(arregloPrueba);


en que estoy fallando?

Jeferi

#1
¿Te refieres a un array, verdad?

Es decir:
Código (javascript) [Seleccionar]
var example = [{a:1}, {a:2}, {a:3}, {b:1}, {b:2}]

Te lo comento porque un objeto:
Código (javascript) [Seleccionar]
var example = {a:1,a:2,a:3,b:1,b:2}
Si muestras example resultaría
Código (javascript) [Seleccionar]
{a:3,b:2}

Lo que quieres obtener es:
Código (javascript) [Seleccionar]
{a:[1,2,3],b:[1,2]}

.rn3w.

#2
si tengo un array
[{a:1}, {a:2}, {a:3}, {b:1}, {b:2}]
y quiero
{a:[1,2,3],b:[1,2]} // el cual es un Map

Jeferi

#3
Cita de: .rn3w. en 17 Septiembre 2016, 03:37 AM
si tengo un array
[{a:1}, {a:2}, {a:3}, {b:1}, {b:2}]
y quiero
{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 (javascript) [Seleccionar]
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[i])
     array[i] = [];

   array[i].push(item[i]);
   return array;
 }
}, []);

console.log(objMapped);


objMapped contiene el nuevo array

Te muestro el resultado en mi máquina:
Código (bash) [Seleccionar]
$ node elhacker-net.js
[ 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 (javascript) [Seleccionar]
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[i])
     array[i] = [];

   array[i] = [...array[i], item[i]];
   return array;
 }
}, []);

console.log(objMapped);


Para aprender más, puedes encontrar información en MDN acerca de ES6.

.rn3w.

del primer ejemplo, todos los "let" lo cambie por var y funciono

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

Jeferi

Cita de: .rn3w. en 17 Septiembre 2016, 04:02 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.

.rn3w.

lo uso sobre nodejs, imag

cual sera el problema(solo por curiosidad)

Jeferi

Ejecuta node --version y postea el resultado.

.rn3w.


Jeferi

Cita de: .rn3w. en 17 Septiembre 2016, 04:19 AM
la version es v4.5.0

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



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

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