Tengo una variedad de objetos.
let filterval = [ { 'tran_type': "cs+", 'date': 2/2/2022, 'amount' 10000 }, { 'tran_type': "cs-", 'date': 2/2/2022, 'amount' 10000 }, { 'tran_type':"cs+", 'date': 3/2/2022, 'amount' 20000 }, { 'tran_type': "opo", 'date': 2/2/2022, 'amount' 10000 },{ 'tran_type': "opi", 'date': 2/2/2022, 'amount' 10000 },{ 'tran_type': "cs+", 'date': 1/2/2022, 'amount' 70000 }, { 'tran_type': "opo", 'date': 1/2/2022, 'amount' 90000 } ]Necesito omitir el objeto si tran_type es cs+ y cs- tienen la misma fecha y la misma cantidad. y si tran_type es opo y opi tienen la misma fecha y la misma cantidad.
Probé mis conocimientos en javascript. pero no funciona correctamente.
Object.keys(filterval).map( data, index =>{ if(data.tran_type == 'cs+'){ Object.keys(filterval).map( data1 =>{ if(data1.tran_type == 'cs-'){ if(data1.date == data.date){ if(data1.amount == data.amount){ data.splice(index, 1) } } } } } if(data.tran_type == 'opo'){ Object.keys(filterval).map( data1 =>{ if(data1.tran_type == 'opi'){ if(data1.date == data.date){ if(data1.amount == data.amount){ data.splice(index, 1) } } } } } }); console.log(filterval)Por favor, ayúdame a obtener el siguiente resultado. Además, corrija mi error en mi código. Las soluciones son bienvenidas. Gracias por adelantado.
[ { 'tran_type':"cs+", 'date': 3/2/2022, 'amount' 20000 }, { 'tran_type': "cs+", 'date': 1/2/2022, 'amount' 70000 }, { 'tran_type': "opo", 'date': 1/2/2022, 'amount' 90000 } ]Debe corregir estas líneas en su código:
1.) 'cantidad': 1000 (faltan los dos puntos) --- Puede usar un editor como el código VS. Es una buena práctica y muy recomendable. Si escribe este código en el editor de código Vs, podrá conocer fácilmente todos los errores de sintaxis que tiene su código.
2.) filterval es una matriz y no un objeto. Entonces no tiene que usar Object.keys. Puede usar map() directamente en filterval.
filterval.map(() => {})Haga checkout console.log(Object.keys(filterval)) --- Imprimirá una matriz de índices. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
3.) data.splice(index, 1) --- splice debe usarse en matrices y no en objetos. Debería ser filterval.splice(index, 1).
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
Recomendaría que antes de usar cualquier método incorporado de JavaScript, consulte los documentos de MDN. Además, es una buena práctica dividir el código en fragmentos más pequeños y seguir comprobando en cada paso si todo va bien o no. Si todo parece estar bien, vaya al siguiente paso. Si algo está mal, corríjalo y luego siga adelante.
Aquí está el código que cumple el propósito.
let filterval = [ { 'tran_type': "cs+", 'date': "2/2/2022", 'amount' : 10000 }, { 'tran_type': "cs-", 'date': "2/2/2022", 'amount' : 10000 }, { 'tran_type':"cs+", 'date': "3/2/2022", 'amount' : 20000 }, { 'tran_type': "opo", 'date': "2/2/2022", 'amount' : 10000 }, { 'tran_type': "opi", 'date': "2/2/2022", 'amount' : 10000 }, { 'tran_type': "cs+", 'date': "1/2/2022", 'amount' : 70000 }, { 'tran_type': "opo", 'date': "1/2/2022", 'amount' : 90000 }] filterval.forEach((data1, index1) => { switch (data1.tran_type) { case 'cs+' : removeIfFound(data1, index1, 'cs-') break; case 'cs-' : removeIfFound(data1, index1, 'cs+') break; case 'opo' : removeIfFound(data1, index1, 'opi') break; case 'opi' : removeIfFound(data1, index1, 'opo') break default : break } }) function removeIfFound(data1, index1, trans_type) { filterval.forEach((data2, index2) => { if (data2.tran_type === trans_type && checkIfEqual(data1, data2)) { filterval.splice(index1, 1) filterval.splice(index2 - 1, 1) return } }) } function checkIfEqual(data1, data2) { return (data1.date === data2.date) && (data1.amount === data2.amount) } console.log(filterval)Avísame por si necesitas alguna explicación.
Cambio :
if(data.tran_type = 'cs+'){el código anterior siempre devuelve verdadero porque está dando el valor data.tran_type de 'cs+' a
if(data.tran_type == 'cs+'){y también
'amount' 10000 //should be : 'amount': 10000 // you don't have ':'y este código está comprobando si data.tran_type es igual al valor de 'cs+'.
e intente escribir mejor su lógica, tener tantos ifs uno dentro de otro es una muy mala práctica, es difícil leer y ver lo que hace el código, intente hacer funciones más pequeñas a las que llame si se cumple alguna condición.
Entonces, rompí tu código en partes y obtuve el resultado que estabas pidiendo, este no es el código más atractivo, pero lo escribí para que puedas revisarlo y tratar de entenderlo.
let array = [ { tran_type: "cs+", date: 2 / 2 / 2022, amount: 10000, }, { tran_type: "cs-", date: 2 / 2 / 2022, amount: 10000, }, { tran_type: "cs+", date: 3 / 2 / 2022, amount: 20000, }, { tran_type: "opo", date: 2 / 2 / 2022, amount: 10000, }, { tran_type: "opi", date: 2 / 2 / 2022, amount: 10000, }, { tran_type: "cs+", date: 1 / 2 / 2022, amount: 70000, }, { tran_type: "opo", date: 1 / 2 / 2022, amount: 90000, }, ]; let finalArray = []; let csPositive = []; let csNegative = []; let opo = []; let opi = []; array.map((element) => { sortByType(element); }); function sortByType(element) { sortCsPositive(element); sortCsNegative(element); sortOpo(element); sortOpi(element); } function sortCsPositive(element) { if (element.tran_type == "cs+") { csPositive.push(element); } } function sortCsNegative(element) { if (element.tran_type == "cs-") { csNegative.push(element); } } function sortOpo(element) { if (element.tran_type == "opo") { opo.push(element); } } function sortOpi(element) { if (element.tran_type == "opi") { opi.push(element); } } function compareDateAndAmout(oneArray, secondArray) { oneArray.forEach((x) => { secondArray.forEach((y) => { y.date == x.date && x.amout == y.amout ? "" : finalArray.push(x); }); }); } compareDateAndAmout(opo, opi); compareDateAndAmout(csPositive, csNegative); console.log(finalArray);