Esto es lo que probé. Además order es parte de una consulta, por lo que funciona, simplemente no estoy publicando el resto del código para que no se ensucie. Recibía errores en los paymentsResults[i].filter() que decían que no es una función. De todos modos, si hay una mejor manera de escribirlo, házmelo saber. Lo aprecio.
const getCatType = order => { if ( order.type === "Invoice" || order.type === "One-time" || order.type === "Free" ) { return "Once"; } else if (order.type === "Semester") { return "Recurring"; } }; for (let i = 0; i < paymentsResults.length; i++) { const paymentsOnce = paymentsResults[i].filter(o => getCatType(o) === "Once"); }Usar un switch sería más útil. Y luego, todo lo que necesita hacer es filter los objetos donde coinciden, sin necesidad de un ciclo adicional.
function getCatType(order) { switch(order.type) { case 'Invoice': case 'One-time': case 'Free': return 'Once'; case 'Semester': return 'Recurring'; default: return null; } } const paymentsResults = [ { type: 'Invoice', id: 1 }, { type: 'Semester', id: 2 }, { type: 'Free', id: 3 }, { type: 'One-time', id: 4 } ]; function typeOfPayment(type) { return paymentsResults.filter(order => { return getCatType(order) === type; }); } console.log(typeOfPayment('Once')); console.log(typeOfPayment('Recurring'));Puede usar reduce y también puede verificar los tipos que necesita directamente en reduce cb, mezcle esto con una expresión regular y puede extraer cualquier tipo de órdenes que desee creando una matriz simple con los tipos que necesita. Suponiendo que sus pagosResultados son algo como esta matriz, puede hacer esto:
const paymentsResults = [ { order: { type: 'Invoice', total: 10 }, price: 2 }, { order: { type: 'One-time', total: 11 } }, { order: { type: 'Free', total: 12 } }, { order: { type: 'Semester', total: 13 } }, ]; let extract = ['Invoice', 'One-time', 'Free']; const regex = new RegExp(extract.join('|'), 'i'); let paymentsOnce = paymentsResults.reduce((acc, obj) => { if (regex.test(obj.order.type)) acc.push(obj); return acc; }, []); console.log(paymentsOnce);Supongo que está confundido con lo que se supone que hace filter() .
filter() es una función de matriz que itera sobre la matriz dada y devuelve los objetos que se ajustan a las condiciones de filtro definidas en la función de devolución de llamada.
Por lo tanto, no necesita for-Loop para ingresar a cada elemento de su matriz, sino que simplemente llame a su función de filtro en la propia matriz.
Esto solo se aplica si tiene una Matriz de objetos con el type de clave en PaymentsResults. Lamentablemente, no proporcionó su estructura de datos de origen. Si no es como supuse, comente a continuación cómo se ve su estructura de datos.
for (let i = 0; i < paymentsResults.length; i++) { const paymentsOnce = paymentsResults[i].filter(o => getCatType(o) === "Once"); }Se convertirá:
// ONLY GIVEN IF YOUR STRUCTURE LOOKS LIKE // paymentsResults = [{type: 'Thing'}, {type: 'Thing'}, ...]; const paymentsOnce = paymentsResults.filter(o => getCatType(o) === "Once");