Tengo dos archivos JSON: JSON A tiene algunas propiedades de la empresa y company_id, mientras que JSON B tiene nombres de empresas e identificaciones de empresas.
JSON Un ejemplo:
[ { "order_name": "Foo", "company_id": "112233" }, { "order_name": "Bar", "company_id": "123456" } ]Ejemplo JSONB:
[ { "company_id":"112233", "name":"ACME company", }, { "company_id":"123456", "name":"John Doe Inc.", } ] ¿Cuál es la forma más eficiente de unir los valores company_id ? Me gustaría tener el JSON C (resultado combinado) con los nombres de las empresas agregados correctamente, así:
[ { "order_name": "Foo", "company_id": "123456", "company_name": "John Doe Inc." }, { "order_name": "Bar", "company_id": "112233", "company_name": "ACME company" } ]¿Es el bucle y el filtro para cada uno la única solución? ¿Hay una manera más eficiente de hacer esto desde el punto de vista del rendimiento?
Más información:
company_idEspero que esto funcione para tí. Hazme saber si tienes alguna pregunta.
const arrayOne = [ { "order_name": "Foo", "company_id": "112233" }, { "order_name": "Bar", "company_id": "123456" } ]; const arrayTwo = [ { "company_id":"112233", "name":"ACME company", }, { "company_id":"123456", "name":"John Doe Inc.", } ]; const [source, target] = arrayOne.length > arrayTwo.length ? [arrayOne, arrayTwo] : [arrayTwo, arrayOne]; const merged = source.map(object => { // Assuming that in the 2nd array, the match is only found 1 time and it EXISTS. const matched = target.find(element => element.company_id === object.company_id); // Merge both objects together return { ...object, ...matched }; }); console.log(merged);Al tener JSON:
const jsonA = [ { "order_name": "Foo", "company_id": "112233" }, { "order_name": "Bar", "company_id": "123456" } ]; const jsonB = [ { "company_id":"112233", "name":"ACME company", }, { "company_id":"123456", "name":"John Doe Inc.", } ];puede fusionar mapas en el tercer mapa con algo como esto:
const transform = (data, current={}) => data.reduce((prev, company) => { if(!prev[company['company_id']]) prev[company['company_id']] = {}; prev[company['company_id']] = {...prev[company['company_id']], ...company} return prev; }, current); let jsonMap = transform(jsonA, {}); jsonMap = transform(jsonB, jsonMap); let jsonC = Object.keys(jsonMap).map(companyId => jsonMap[companyId] ); console.log(jsonC);En JavaScript moderno común, puede hacer esto como mencionó con funciones de orden superior como map , filter , etc.:
const arrayA = [ { "order_name": "Foo", "company_id": "112233" }, { "order_name": "Bar", "company_id": "123456" } ] const arrayB = [ { "company_id":"112233", "name":"ACME company", }, { "company_id":"123456", "name":"John Doe Inc.", } ] const mergeAB = arrayA.map( companyA => { const matched = arrayB.find(companyB => companyB.company_id === companyA.company_id) if(matched) { return {...companyA, ...matched} } else { // return companyA element or customize it with your case } } ) console.log(mergeAB) Nota 1 : la complejidad del método Array.find() es O(n) y la complejidad del método Array.map() es O(n)
Nota 2: la eficiencia es algo importante, pero no en todas las situaciones. a veces necesita hacer este tipo de iteración una vez o para un tamaño de matriz pequeño, por lo que no debe preocuparse por el rendimiento.
Nota 3: puede comparar la respuesta y encontrar su mejor solución ya que no conocemos todo su código y aplicación.