From 7cd946181eeecf61d8754304c28eece72894d905 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Tue, 20 Jan 2026 00:10:51 +0100 Subject: [PATCH] Refactor _extractVocabFromExercises method for improved array handling - Enhanced the method to better handle various input types, including array-like objects, with detailed console logging for conversion attempts and errors. - Implemented a fallback mechanism for manual conversion of non-array inputs, ensuring robustness in vocabulary extraction. - Updated comments for clarity on input expectations and processing logic, improving maintainability. --- frontend/src/views/social/VocabLessonView.vue | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/frontend/src/views/social/VocabLessonView.vue b/frontend/src/views/social/VocabLessonView.vue index e902640..3108d74 100644 --- a/frontend/src/views/social/VocabLessonView.vue +++ b/frontend/src/views/social/VocabLessonView.vue @@ -412,7 +412,9 @@ export default { console.error('Fehler in importantVocab computed property:', e); return []; } - }, + } + }, + methods: { _extractVocabFromExercises(exercises) { // Sicherstellen, dass exercises ein Array ist if (!exercises) { @@ -420,17 +422,32 @@ export default { return []; } - // Konvertiere zu Array falls nötig + // Konvertiere Vue Proxy oder Objekt zu Array let exercisesArray = exercises; - if (!Array.isArray(exercises)) { - console.warn('[_extractVocabFromExercises] exercises ist kein Array, versuche zu konvertieren:', exercises); - // Falls es ein Objekt mit length ist, versuche es zu konvertieren - if (typeof exercises === 'object' && exercises.length !== undefined) { + + // Prüfe ob es bereits ein Array ist (auch Vue Proxy-Arrays) + const isArrayLike = exercises.length !== undefined && typeof exercises.length === 'number'; + + if (!Array.isArray(exercises) && isArrayLike) { + console.log('[_extractVocabFromExercises] exercises ist kein Array, aber array-like, konvertiere...'); + // Versuche Array.from (funktioniert mit iterierbaren Objekten und Array-like Objekten) + try { exercisesArray = Array.from(exercises); - } else { - console.error('[_extractVocabFromExercises] Kann exercises nicht zu Array konvertieren:', exercises); - return []; + } catch (e) { + // Fallback: Manuelle Konvertierung + try { + exercisesArray = []; + for (let i = 0; i < exercises.length; i++) { + exercisesArray.push(exercises[i]); + } + } catch (e2) { + console.error('[_extractVocabFromExercises] Kann exercises nicht zu Array konvertieren:', exercises, e2); + return []; + } } + } else if (!Array.isArray(exercises)) { + console.error('[_extractVocabFromExercises] exercises ist weder Array noch array-like:', exercises); + return []; } const vocabMap = new Map(); @@ -507,14 +524,12 @@ export default { } catch (e) { console.warn('Fehler beim Extrahieren von Vokabeln aus Übung:', e, exercise); } - }); + }); const result = Array.from(vocabMap.values()); console.log(`[_extractVocabFromExercises] Ergebnis:`, result.length, 'Vokabeln'); return result; - } - }, - watch: { + }, courseId(newVal, oldVal) { if (newVal !== oldVal) { // Reset Flags beim Kurswechsel