Tengo una función que almacena los valores de una fila en un evento de matriz onkeyup. Sin embargo, hay instancias en las que almacenaría los mismos valores de fila pero difieren en la cantidad y el total pero la misma identificación. ¿Cómo lo almacenaría en la matriz de manera que solo guardara el conjunto de valores más actual de una identificación específica? Sé que es un poco confuso, pero echa un vistazo a la imagen de abajo. Gracias por la ayuda.
Me gustaría guardar el ff:
{id:"1", qty:"4", price:"45", total:"180"} {id:"2", qty:"3", price:"10", total:"30"} {id:"3", qty:"50", price:"12", total:"600"} {id:"4", qty:"60", price:"12", total:"720"}Mi código:
var arrayVar = []; var data; $(function(){ $('#tbl-po-list').on( 'keyup change' , 'input[type="number"]' ,function(){ $(this).parents('.info').find('.total').val($(this).val() * $(this).parents('.info').find('.price').val()); data = { id: $(this).parents('.info').find('.prod-id').val(), qty: $(this).val(), price: $(this).parents('.info').find('.price').val(), total: $(this).parents('.info').find('.total').val() } arrayVar.push(data); for(var i = 0; i < arrayVar.length; i++){ console.log(arrayVar[i]); } }); });Puedes lograr eso si reemplazas:
arrayVar.push(data);por:
for(var i = 0; i < arrayVar.length; i++){ if (arrayVar[i].id === data.id) break; // found the same id! } arrayVar[i] = data;Si el bucle no encuentra el mismo id , entonces después del bucle igualaré arrayVar.length , y así la asignación será como un empujón.
Si, por otro lado, se encuentra la identificación , entonces el bucle sale y la asignación reemplazará lo que haya antes en ese elemento de la matriz.
Una versión más concisa de lo mismo:
for(var i = 0; i < arrayVar.length && arrayVar[i].id !== data.id; i++); arrayVar[i] = data;Parece maduro para un poco de golf de código. Aquí está mi intento:
o=data.reduce((a,v)=>a[v.id]=v&&a,{});Object.keys(o).map(k=>o[k]);Codigo original:
obj = data.reduce((accum, value, i) => { accum[value.id] = value; return accum; }) out = Object.keys(obj).map(key => obj[key]);Esto funciona mediante el uso de reducir para acumular valores en un objeto (usar la identificación como clave significa que las filas con la misma identificación se sobrescribirán) y luego extrae los valores del objeto.