Tome la siguiente estructura de datos
report = { fraud_ids: [2, 3, 4, 15], } fraudTypes: { ACH: { fraud_category: "fraud", fraud_subcategory: "a", fraud_type_id: "4", }, 'Account takeover': { fraud_category: "misc", fraud_subcategory: "a", fraud_type_id: "2", }, 'Advance fee': { fraud_category: "fraud", fraud_subcategory: "b", fraud_type_id: "8", }, 'Against Financial Institution Customer(s)': { fraud_category: "cyber", fraud_subcategory: "b", fraud_type_id: "15", }, 'Against Financial Institution(s)': { fraud_category: "cyber", fraud_subcategory: "a", fraud_type_id: "78", }, 'Alters or cancels transaction to avoid BSA recordkeeping requirement': { fraud_category: "structuring", fraud_subcategory: "a", fraud_type_id: "3", }, }Quiero hacer coincidir el objeto de tipo de fraude con el número correcto en la matriz por fraude_tipo_id. Y cuando encuentro una coincidencia, solo quiero devolver la clave del objeto.
Entonces, usando el ejemplo anterior, devolvería ['Account takeover', 'Alters or cancels transaction to avoid BSA recordkeeping requirement', 'ACH', Against Financial Institution Customer(s)']
Escribí la siguiente lógica y, para mi sorpresa, obtuve una matriz de cuatro elementos que devuelven indefinidos.
const x = report.fraud_ids.map(id => { Object.keys(fraudTypes).map(fraudDescription => { if (parseInt(fraudTypes[fraudDescription].fraud_type_id, 10) === id) { return true; } }); });Esperaba que esto devolviera los cuatro objetos coincidentes y luego sé que tengo que escribir lógica adicional solo para devolver las claves. ¿Qué estoy haciendo mal?
Consulte el código Sandbox .
No está devolviendo nada desde la primera devolución de llamada, ni .map es el método interno correcto; en su lugar, use .find para encontrar la clave con la ID coincidente.
report={fraud_ids:[2,3,4,15],fraudTypes:{ACH:{fraud_category:"fraud",fraud_subcategory:"a",fraud_type_id:"4"},"Account takeover":{fraud_category:"misc",fraud_subcategory:"a",fraud_type_id:"2"},"Advance fee":{fraud_category:"fraud",fraud_subcategory:"b",fraud_type_id:"8"},"Against Financial Institution Customer(s)":{fraud_category:"cyber",fraud_subcategory:"b",fraud_type_id:"15"},"Against Financial Institution(s)":{fraud_category:"cyber",fraud_subcategory:"a",fraud_type_id:"78"},"Alters or cancels transaction to avoid BSA recordkeeping requirement":{fraud_category:"structuring",fraud_subcategory:"a",fraud_type_id:"3"}}}; const x = report.fraud_ids.map(id => ( Object.keys(report.fraudTypes).find(fraudDescription => Number(report.fraudTypes[fraudDescription].fraud_type_id) === id) )); console.log(x);No sé si esto es lo que quieres, pero ahí va.
const selectedFrauds = report.fraud_ids.map((id, index) => { return( Object.values(fraudTypes).map((fraud, idx) => { return id === +fraud.fraud_type_id ? fraud : ""; }) ) }) const cleanSelectedFrauds = selectedFrauds.map((el) => { return el.filter((innerEl) => { if(innerEl) { return innerEl } }) }); console.log(cleanSelectedFrauds)Esto devolverá la siguiente matriz:
[ [ { fraud_category: 'misc', fraud_subcategory: 'a', fraud_type_id: '2' } ], [ { fraud_category: 'structuring', fraud_subcategory: 'a', fraud_type_id: '3' } ], [ { fraud_category: 'fraud', fraud_subcategory: 'a', fraud_type_id: '4' } ], [ { fraud_category: 'cyber', fraud_subcategory: 'b', fraud_type_id: '15' } ] ]