tengo una matriz
const dataCheck = ["Rohit","Ravi"];Tengo otra matriz de objetos.
const userData = [ { name: "Sagar" }, { name: "Vishal" }, { name: "Rohit" }, { name: "Ravi" }, ];Quiero verificar si algún valor en dataCheck está presente en los datos de usuario y luego devolver una nueva matriz con los datos a continuación
const newData = [ { name: "Sagar" }, { name: "Vishal" }, { name: "Rohit", status: "present" }, { name: "Ravi", status: "present" }, ];Intenté hacer algo usando bucles pero no obtuve los resultados esperados.
const dataCheck = ["Rohit", "Ravi"]; const userData = [ { name: "Sagar" }, { name: "Vishal" }, { name: "Rohit" }, { name: "Ravi" } ]; let newDataValue = {}; let newData = []; userData.forEach((user) => { const name = user.name; dataCheck.forEach((userName) => { if (name === userName) { newDataValue = { name: name, status: "present" }; } else { newDataValue = { name: name }; } newData.push(newDataValue); }); }); console.log(newData);Mi prueba me da resultados repetidos múltiples resultados que son solo duplicados
Deberías usar map() y un Set .
const dataCheck = ["Rohit","Ravi"]; const userData = [ { name: "Sagar" }, { name: "Vishal" }, { name: "Rohit" }, { name: "Ravi" }, ]; const set = new Set(dataCheck); const output = userData.map(data => set.has(data.name) ? ({...data, status: "present"}): data) console.log(output) .as-console-wrapper { max-height: 100% !important; top: 0; } Un Set permite búsquedas en tiempo O(1) y, por lo tanto, este algoritmo funciona en tiempo O(n) . Si usara la matriz para búsquedas (por ejemplo, usando indcludes() , find() etc.) el tiempo de ejecución sería O(n²) . Aunque esto ciertamente no importará en absoluto para arreglos tan pequeños, se volverá más relevante cuanto más grande sea el arreglo.
map() se usa aquí porque desea un mapeo 1:1 de entradas a salidas. Lo único que hay que determinar entonces es cuál debe ser la salida. Es la entrada, si el valor no está en el Set , o es la entrada extendida por un status de propiedad establecido en "present" . Puede verificar la presencia en un Set usando el método has() y puede usar el ternary operator ? para tomar la decisión de qué caso es.
userData , verifique si el nombre está incluido en dataCheck . Si es true , agregue el estado 'presente'.
const dataCheck = ["Rohit","Ravi"]; const userData = [ { name: "Sagar" }, { name: "Vishal" }, { name: "Rohit" }, { name: "Ravi" }, ]; for (let user of userData) { if(dataCheck.includes(user.name)) { user.status = 'present' } } console.log(userData) const dataCheck = ["Rohit", "Ravi"]; const userData = [ { name: "Sagar" }, { name: "Vishal" }, { name: "Rohit" }, { name: "Ravi" }, ]; // map through every object and check if name property // exists in data check with help of filter. // if it exists the length of filter should be 1 so // you should return { name: el.name, status: "present" } else // return { name: el.name } let newData = userData.map((el) => { if (dataCheck.filter((name) => name === el.name).length > 0) { return { name: el.name, status: "present" }; } else { return { name: el.name }; } }); console.log("newdata: ", newData);