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 codigovar 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?
¿Te refieres a un array, verdad?
Es decir:
var example = [{a:1}, {a:2}, {a:3}, {b:1}, {b:2}]
Te lo comento porque un objeto:
var example = {a:1,a:2,a:3,b:1,b:2}
Si muestras example resultaría
{a:3,b:2}
Lo que quieres obtener es:
{a:[1,2,3],b:[1,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
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.
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:
$ 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
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 (https://developer.mozilla.org/es/) acerca de ES6.
del primer ejemplo, todos los "let" lo cambie por var y funciono
y del segundo no reconoce
Citararray = [...array, item];
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.
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)
Ejecuta node --version y postea el resultado.
la version es v4.5.0
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 (...)"
(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í.
gracias, ya vere si lo actualizo y si no tengo algun problema luego de hacerlo
:laugh: :laugh: :laugh:
si en vez de esto:
Citar[{a:1}, {a:2}, {a:3}, {b:1}, {b:2}]
tengo :
function claves(id, time) {
this.id = id;
this.time = time;
}
key_cadaTecla.push(new claves(event.keyCode,tiempoPulsacion));
es decir tendria
[ObjetoClaves(a:1),ObjetoClaves(a:2), ObjetoClaves(a:3), ObjetoClaves(b:1), ObjetoClaves(b:2)]
este es el codigo que me pasaste
Citarconst 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
Cita de: .rn3w. en 17 Septiembre 2016, 15:19 PM
tengo :
function claves(id, time) {
this.id = id;
this.time = time;
}
key_cadaTecla.push(new claves(event.keyCode,tiempoPulsacion));
Tendrías:
[{id: a, time: 1}, {id: a, time: 2}, {id: b, time: 1}]
Para este objeto debes modificar el código a:
const obj = [{id: 'a', time: 1}, {id: 'a', time: 2}, {id: 'b', time: 1}];
const objMapped = obj.reduce((array, item) => {
let { id, time } = item;
if (!array[id])
array[id] = [];
array[id].push(time);
return array;
}, []);
console.log(objMapped);
Cita de: Jeferi en 17 Septiembre 2016, 16:37 PM
Tendrías:
[{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.
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);
Cita de: MinusFour en 17 Septiembre 2016, 20:26 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)
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
[{"id":65,"time":98},{"id":83,"time":170}]
cuando intento acoplar la funcion con el array de arriba no funciona asi:
var fabricar=function(obj){
const objMapped = obj.reduce((acc, item) => {
let { id, time } = item;
acc[id] = acc[id] || [];
acc[id].push(time);
return acc;
}, {});
console.log(objMapped);
}
exports.fabricar=fabricar;
el codigo:
no funcionara ? no se podra refactorizar? por mas que intento no funciona
Lo mas probable es que quieras que fabricar regrese el arreglo mapeado y no solo hacer el console.log.
si porque necesito el Map, pero quiero ir por pasos, primero me conformaria solo con el console.log
gracias y saludos...
A mi me funciona tal cual. Tu arreglo probablemente no sea ese o no estes usando el modulo correctamente.
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:
var ror2 = require('./node_modules/node-svm/sample/fabrica');
y lo uso asi
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
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
const objMapped = obj.reduce((acc, item) => {
let { id, time } = item;
acc[id] = acc[id] || [];
acc[id].push(time);
return acc;
}, []);
console.log(objMapped);
}
exports.fabricar=fabricar;
el array que mando se muestra y luego falla , hasta "console.log(obj);// muestra el array que mando" todo bien.
aqui no entra, lo puse un console.log en medio de esa funcion y no muestra nada
const objMapped = obj.reduce((acc, item) => {
let { id, time } = item;
acc[id] = acc[id] || [];
acc[id].push(time);
return acc;
}, []);
¿Cual es el error exactamente? Lo único que se me ocurre es que estes haciendo algo como:
exports.fabricar = fabricar;
module.exports = {}; //o
exports.fabricar = {}; //o alguna otra cosa
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
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
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:
ror2.fabricar([{"id":65,"time":98},{"id":83,"time":170}]);
funciona al 100%
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
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.
lo probare gracias!!!
y luego comento si funciono!!! estas en lo correcto si funciona!!!
ahora tengo otra pregunta como recorro/iterar el objeto ?
Citarconst 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:
Object.keys(obj).forEach(key => {
let value = obj[key]
})