Tengo la siguiente entrada de la siguiente manera. Es una matriz de objetos y cada objeto tiene estados que también es una matriz de objetos. Quiero agregar details dentro del objeto de estados cuando la identificación del estado coincida con la id que se menciona a continuación. es decir 82175746
const input = [ { "country": { "id": 87745195, "action": "Analyze" }, "states": [ { "id": 83589582, "action": "Verify" }, { "id": 87335656, "action": "Analyze" } ] }, { "country": { "id": 83861166, "action": "Verify" }, "states": [ { "id": 82175746, "action": "Closed" }, { "id": 78745158, "action": "Closed" } ] } ] const details = { "totalOpenRadars": 1, "totalClosedRadars": 1 } const id = 82175746Y este es el resultado que estoy tratando de lograr. Tenga en cuenta que la identificación de 82175746 se compara con todas las identificaciones estatales. una vez que se encuentra una coincidencia, los detalles mencionados anteriormente se agregan como se muestra a continuación al objeto coincidente.
const result = [ { "country": { "id": 87745195, "action": "Analyze" }, "states": [ { "id": 83589582, "action": "Verify" }, { "id": 87335656, "action": "Analyze" } ] }, { "country": { "id": 83861166, "action": "Verify" }, "states": [ { "id": 82175746, "action": "Closed", "details": { "totalOpenRadars": 1, "totalClosedRadars": 1 } }, { "id": 78745158, "action": "Closed" } ] } ]Para lograr esto, lo intenté de esta manera, pero no puedo obtener el resultado correctamente. ¿Alguien puede decirme dónde me equivoqué?
const result = input.forEach((element) => { element.states.forEach((state) => { if(state.id === id) { state.details = details } }); });Array.forEach siempre devuelve undefined , por lo que el result siempre será undefined . Si observa la input después de su operación, contiene sus detalles como especificó.
Alternativamente, puede distribuir input en una nueva matriz llamada result y realizar su bucle en el result si tiene la intención de mantener la input igual.
const input = [ { "country": { "id": 87745195, "action": "Analyze" }, "states": [ { "id": 83589582, "action": "Verify" }, { "id": 87335656, "action": "Analyze" } ] }, { "country": { "id": 83861166, "action": "Verify" }, "states": [ { "id": 82175746, "action": "Closed" }, { "id": 78745158, "action": "Closed" } ] } ] const details = { "totalOpenRadars": 1, "totalClosedRadars": 1 } const id = 82175746 input.forEach((element) => { element.states.forEach((state) => { if(state.id === id) { state.details = details } }); }); console.log(input);Puedes usar Array.prototype.map() :
const input = [{"country": { "id": 87745195, "action": "Analyze" },"states": [{ "id": 83589582, "action": "Verify" },{ "id": 87335656, "action": "Analyze" }]},{"country": { "id": 83861166, "action": "Verify" },"states": [{ "id": 82175746, "action": "Closed" },{ "id": 78745158, "action": "Closed" }]}] const details = { "totalOpenRadars": 1, "totalClosedRadars": 1 } const id = 82175746 const result = input.map(item => item.states.map(state => ({ ...state, ...(state.id === id ? { details } : {}) }))) console.log(result)esto debería ser hacerlo
const appendDetails = (data, id, details) => data.map(d => { return { ...d, states: d.states.map(s => { if(s.id !== id){ return s } return { ...s, details } }) } }) const input = [ { "country": { "id": 87745195, "action": "Analyze" }, "states": [ { "id": 83589582, "action": "Verify" }, { "id": 87335656, "action": "Analyze" } ] }, { "country": { "id": 83861166, "action": "Verify" }, "states": [ { "id": 82175746, "action": "Closed" }, { "id": 78745158, "action": "Closed" } ] } ] const details = { "totalOpenRadars": 1, "totalClosedRadars": 1 } const id = 82175746 console.log(appendDetails(input, id, details))