Tengo una serie de objetos como este:
let arr1 = [{ "ref": 1, "index": "300", "data": { "id": 10, "status": { "code": "red" } } }, { "ref": 2, "index": "301", "data": { "id": 20, "status": { "code": "blue" } } }];Quiero reemplazar el código de estado por el dado en esta otra matriz de objetos:
let arr2 = [{ "id": 10, "content": { "name": "green" } }, { "id": 20, "content": { "name": "yellow" } }];Mi idea es mapear la primera matriz y usar la función de búsqueda (o filtro) para recorrer la segunda matriz y cuando la coincidencia de ID cambia los valores, pero me falta algo, ¿cómo puedo hacer esto de la manera más optimizada para el rendimiento y la legibilidad? ¿camino?
let res: any[]; res = arr2.map((x: any) => arr1.find((y: any) => (y.data.id === x.id) ? 'logic if match' : 'return' ));Primero cambiaría el formato de arr2 de tal manera que sea más fácil acceder a dicho formato: (Si puede cambiar fácilmente cómo obtiene estos datos, creo que sería mejor. De lo contrario, transforme los datos como se muestra a continuación. )
const idStatusCodeMap = { "10": "green", "20": "yellow" } Hacemos esto para poder ver si hay idStatusCodeMap[10] o idStatusCodeMap[anyId] . Esto hace posible que solo realice un bucle a través de arr1 , no un bucle anidado para arr1 y arr2 . Luego, arr1 y reemplace los colores si es necesario. Si se supone que no se encuentra un nuevo color en idStatusCodeMap , como para id = 30 , entonces no haga nada al respecto.
let arr1 = [{ "ref": 1, "index": "300", "data": { "id": 10, "status": { "code": "red" } } }, { "ref": 2, "index": "301", "data": { "id": 20, "status": { "code": "blue" } } }]; let arr2 = [{ "id": 10, "content": { "name": "green" } }, { "id": 20, "content": { "name": "yellow" } }]; let idStatusCodeMap = {} //transpiling arr2 to more performant hashMap arr2.forEach(item => { idStatusCodeMap[item.id] = item.content.name; }) console.log(idStatusCodeMap); arr1 = arr1.map(item => { //if the id of an item in arr1 is found in code map, replace it with new value. //if not found, it will skip. if(idStatusCodeMap[item.data.id]) { item.data.status.code = idStatusCodeMap[item.data.id] } return item; }) console.log(arr1);