Obtengo las industrias de una API a la que llamo. Obtengo la identificación y para cada industria solo quiero mostrar las industrias que están activas llamando también a mis casos de estudio desde otra llamada a la API. Estoy presionando la identificación de la industria que se está buscando en la API desde el bucle for y la inserto en la matriz activeIndustries y luego devuelvo el resultado de activeIndustries. El problema es que tengo duplicados. Industrias duplicadas . Creo que el problema es que la industria está entrando como un objeto y activeIndustries está entrando como una variedad de objetos, así que creo que, dado que no son lo mismo, están reiterando. Este es mi console.log para study.industries, puede ver los ID repetidos: Registro de la consola ¿Cómo puedo evitar que esto se duplique y solo mostrarlo una vez? ¡Gracias por adelantado!
function getActiveIndustries() { const activeIndustries = []; industries.forEach((industry) => { //ex: industry.id = 374 -> a number console.log(`for each get active industries ` + industry.id); for (let i = 0; i < caseStudies.length; i++) { //ex: study is one object //study.industries = array of ids [374, 373] let study = caseStudies[i]; console.log(`study ` + study.industries); if (study.industries.includes(industry.id)) { activeIndustries.push(industry); //industry is an object {} & activeIndustries is an array of objects[{}] } } });
¿Esto supone que caseStudies
es una matriz de todas las industrias activas que desea incluir que tengan una propiedad de identificación?
Por lo que leí, su problema es que solo está viendo si la industria existe dentro de la matriz caseStudies
. No estaba agregando ningún condicional para determinar si debe o no debe agregar el elemento si existe en su matriz activeIndustries
.
Array.prototype.includes()
Array.includes() Simplemente devuelve verdadero o falso, por lo que su condicional original (study.industries.includes(industry.id)
siempre devolvería true
si existiera en esa matriz. Entonces, si la matriz tiene valores duplicados, esos también serán empujados. Pero agregando el condicional que agregué. Comprueba si devuelve false
, lo que significa que aún no existe dentro de la matriz en la que lo agregará.
function getActiveIndustries() { const activeIndustries = []; industries.forEach((industry) => { //ex: industry.id = 374 -> a number console.log(`for each get active industries ` + industry.id); caseStudies.forEach((study) => //You for loop can also be a forEach to save writing. { console.log(`study ${study.industries}`); if(study.industries.includes(industry.id)) //Returns true if its in the case study- Which means its active? { //So you need to also check to make sure the industry is not included in the activeIndustries //before adding it. if(!activeIndustries.includes(industry)) activeIndustries.push(industry); } //industry is an object {} & activeIndustries is an array of objects[{}] }); }); }
Puede usar un conjunto para extraer identificadores study.industries
ids
que también es una matriz de objetos. Hacer esto le dará una serie de identificadores (después de usar map sobre studies.industries
y luego usar el constructor Set sobre esa matriz) que son únicos.
function getActiveIndustries() { const activeIndustries = []; industries.forEach((industry) => { //ex: industry.id = 374 -> a number console.log(`for each get active industries ` + industry.id); for (let i = 0; i < caseStudies.length; i++) { //ex: study is one object //study.industries = array of ids [374, 373] let study = caseStudies[i]; console.log(`study ` + study.industries); // Modified Code // map iterates through all elements in study.industries const caseStudyIds = study.industries.map((element) => { return element.id; }); // ... spread operator converts set back into an array const caseStudyIdsUnique = [...new Set(caseStudyIds)]; if (caseStudyIdsUnique.includes(industry.id)) { activeIndustries.push(industry); //industry is an object {} & activeIndustries is an array of objects[{}] } } }); };
Creo que el problema aquí es que estás empujando constantemente la misma industria hacia industrias activas.
p.ej
industrias.forEach((industria) // supongamos industria = 1... Fingir industrias = h... Fingir que el estudio comienza en 0...
Dentro de su bucle for se generará en la primera iteración... 0.h.includes(1) ? Supongamos que esto pasa, empujemos la industria "1" a la matriz.
Segunda iteración... 1.h.incluye(1)? Suponga que vuelve a pasar, inserte el mismo valor "1" que antes en la matriz.
Ahora ya tiene un valor duplicado en su matriz.
No cambiará el valor de la industria hasta que finalice el ciclo for... Dentro del foreach...
Así que ese podría ser el caso. Déjame saber si mi respuesta te ayuda.