Estoy trabajando en el siguiente fragmento:
let prevFilterName = '' let filterCourse = '' let filterIds = ['1','2','3','4','5','6','7','8','9'] let filterDetails = [ { id: 1, Name: 'David', Course: 'English' }, { id: 2, Name: 'Peter', Course: 'German' }, { id: 3, Name: 'Peter', Course: 'React' }, { id: 4, Name: 'John', Course: 'English' }, { id: 5, Name: 'John', Course: 'NodeJs' }, { id: 6, Name: 'John', Course: 'Docker' }, { id: 7, Name: 'Andrew', Course: 'Dutch' }, { id: 8, Name: 'Andrew', Course: 'Angular' }, { id: 9, Name: 'David', Course: 'SQL' } ] filterIds.forEach((id) => { let FindFilter = filterDetails.find((filterItem) => {return filterItem.id == id}) console.log(FindFilter); if (prevFilterName == FindFilter.Name){ filterCourse = filterCourse + ',' + FindFilter.Course } else if (prevFilterName != FindFilter.Name){ filterCourse = filterCourse + FindFilter.Course + ' > ' } prevFilterName = FindFilter.Name console.log(filterCourse) })La salida que estoy esperando es:
Inglés > Alemán, React > Inglés, NodeJs, Docker > Holandés, Angular, SQL
Pero obtengo la salida de la siguiente manera:
Inglés > Alemán > ,ReactEnglish > ,NodeJs,DockerDutch > ,AngularSQL >
¿Alguien puede ayudar aquí para hacerlo bien?
Cuando se detecta una diferencia, entonces haces
filterCourse = filterCourse + FindFilter.Course + ' > ' Está colocando el > en el lugar equivocado: debe estar entre el elemento anterior y el actual, no después de ambos.
let prevFilterName="",filterCourse="",filterIds=["1","2","3","4","5","6","7","8","9"],filterDetails=[{id:1,Name:"David",Course:"English"},{id:2,Name:"Peter",Course:"German"},{id:3,Name:"Peter",Course:"React"},{id:4,Name:"John",Course:"English"},{id:5,Name:"John",Course:"NodeJs"},{id:6,Name:"John",Course:"Docker"},{id:7,Name:"Andrew",Course:"Dutch"},{id:8,Name:"Andrew",Course:"Angular"},{id:9,Name:"David",Course:"SQL"}]; filterIds.forEach((id) => { let FindFilter = filterDetails.find((filterItem) => { return filterItem.id == id }) if (prevFilterName == FindFilter.Name) { filterCourse = filterCourse + ',' + FindFilter.Course } else if (prevFilterName && prevFilterName != FindFilter.Name) { filterCourse = filterCourse + ' > ' +FindFilter.Course; } else { // initial filterCourse = FindFilter.Course; } prevFilterName = FindFilter.Name }) console.log(filterCourse) Otro método, que preferiría: agrupar los objetos primero, luego unirlos por el delimitador necesario ( , o > ).
const filterDetails=[{id:1,Name:"David",Course:"English"},{id:2,Name:"Peter",Course:"German"},{id:3,Name:"Peter",Course:"React"},{id:4,Name:"John",Course:"English"},{id:5,Name:"John",Course:"NodeJs"},{id:6,Name:"John",Course:"Docker"},{id:7,Name:"Andrew",Course:"Dutch"},{id:8,Name:"Andrew",Course:"Angular"},{id:9,Name:"David",Course:"SQL"}]; let previousName; const grouped = []; for (const obj of filterDetails) { if (obj.Name !== previousName) { grouped.push([]); } grouped[grouped.length - 1].push(obj.Course); previousName = obj.Name; } const result = grouped .map(courses => courses.join(',')) .join(' > '); console.log(result);