Desea fusionar valores clave de objeto con otro valor de objeto.
Supongamos que la clave del objeto de resultados debe coincidir con la coincidencia del nombre_clave del objeto de los encabezados porque el encabezado debe ser CamelCase. Tengo un objeto de encabezados es:
let headers = [ { key_name: 'pid', header_value: 'PID' }, { key_name: 'card_no', header_value: 'Card Number' }, { key_name: 'trans_id', header_value: 'Transaction ID' }, { key_name: 'card_name', header_value: 'Card Name' } ]resultados El objeto es:
let results = let results = [ { pid: '1234567890', card_no: '546.......3742', trans_id: '2019124453159', card_name: 'Mastercard', code: '$' }, { pid: '1234567890', card_no: '546.......3742', trans_id: '2019120534555', card_name: 'Visa', code: 'INR' } ]Los valores coincidentes del nombre_clave del objeto de encabezado deben filtrarse en los resultados finales Objeto como se muestra a continuación. resultados esperados es:
let results = [ { PID: '1234567890', Card Number: '546.......3742', Transaction ID: '2019124453159', Card Name: 'Mastercard' }, { PID: '1234567890', Card Number: '546.......3742', Transaction ID: '2019120534555', Card Name: 'Visa' } ]Intenté con el siguiente script que solo devuelve todos los valores:
for (let index = 0; index < results.length; index++) { for (let i = 0; i < headers.length; i++) { console.log(results [index][header[i].key_name]) } }Sugeriría convertir el primer objeto en un mapa, para que tenga una búsqueda más rápida. Luego convierta sus objetos en pares clave/valor con Object.entries , realice el mapeo y el filtrado, y luego vuelva a convertir esos pares en un objeto con Object.fromEntries
let headers = [{ key_name: 'pid', header_value: 'PID' },{key_name: 'card_no',header_value: 'Card Number'},{key_name: 'trans_id',header_value: 'Transaction ID'},{key_name: 'card_name',header_value: 'Card Name'}]; // Convert to map: let map = new Map(headers.map(({key_name, header_value}) => [key_name, header_value])); let arr = [{pid: '1234567890',card_no: '546.......3742',trans_id: '2019124453159',card_name: 'Mastercard',code: '$'},{pid: '1234567890', card_no: '546.......3742',trans_id: '2019120534555',card_name: 'Visa',code: 'INR'}]; // Use map to make transition let result = arr.map(obj => Object.fromEntries(Object.entries(obj).map(([key, value]) => map.has(key) && [map.get(key), value] ).filter(Boolean)) ); console.log(result);Puede buscar en Object.keys(..) de la matriz de resultados para que pueda asignar los valores de clave antiguos a los nuevos. Podrías usar algo como esto:
const mappedHeaders = results.map((r) => { const keys = Object.keys(r); let newObj = {}; for (const key of keys) { const newHeader = headers.find((h) => h.key_name === key); if (newHeader) newObj[newHeader.header_value] = r[key]; } return newObj; });Es posible que deba verificar si existe la asignación y manejar esos casos para evitar errores.