let listOne = [Bill, Joe, Trever, Neil, Jim, Pam, Michael] let listTwo = [Petter, Pam, Steven, Jim, Michael, Scott]Tengo dos listas pero quiero crear una nueva lista con solo los nombres en ambas listas.
[Jim, Pam, Michael]Lo que hice:
Creo un bucle anidado para insertar cada nombre en una nueva lista
en que necesito ayuda:
Siento que hay una mejor manera de hacer esto. sin tener que anidar mis bucles. Quizás de alguna manera filtrando ambas listas simultáneamente de alguna manera
Puede utilizar Set y filter aquí. Verificar la existencia del name en Set es eficiente, si vas a usar has method of set .
let listOne = ["Bill", "Joe", "Trever", "Neil", "Jim", "Pam", "Michael"]; let listTwo = ["Petter", "Pam", "Steven", "Jim", "Michael", "Scott"]; const set = new Set(listOne); const result = listTwo.filter(name => set.has(name)); // or // const result = listTwo.filter(set.has.bind(set)); console.log(result);Puede usar Array.prototype.reduce, hacer que la devolución de llamada busque en la otra lista y solo inserte el nombre si está en la otra lista.
listOne.reduce((prev, cur)=>{ if(listTwo.includes(cur)){ prev.push(cur); } return prev; }); EDITAR: después de más pruebas, Array.prototype.reduce requiere que el primer y el segundo argumento tengan un tipo de número, por lo que recomendaría usar el filtro en su lugar. (ver otras respuestas)
Sin embargo, si desea usar reducir, tendría que usar algo como esto:
let listOne = ["Bill", "Joe", "Trever", "Neil", "Jim", "Pam", "Michael"]; let listTwo = ["Petter", "Pam", "Steven", "Jim", "Michael", "Scott"]; let results = []; listOne.reduce((prev, cur)=> { if(listTwo.includes(cur)){ results.push(cur); } return; }); console.log(results); // Prints [ 'Jim', 'Pam', 'Michael' ]Mi recomendación es usar la respuesta aceptada por Vitor Franca y usar Array.prototype.filter
Puedes hacer algo como esto:
let listOne = [Bill, Joe, Trever, Neil, Jim, Pam, Michael] let listTwo = [Petter, Pam, Steven, Jim, Michael, Scott] let result = listOne.filter(item => listTwo.includes(item))