From 8c60e0a0d2a6c02068e68f42fc76f196087ba516 Mon Sep 17 00:00:00 2001 From: Mischa POSLAWSKY Date: Thu, 30 Dec 2021 05:55:21 +0100 Subject: [PATCH] word/quiz: filter preset category and empty subcategories Calculate category tree from references added in the previous commit. Configure preset.cat to test. --- word/quiz.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/word/quiz.js b/word/quiz.js index 146aff7..e2e8cb6 100644 --- a/word/quiz.js +++ b/word/quiz.js @@ -10,9 +10,35 @@ class WordQuiz { dataselect(json) { // find viable rows from json data let rows = Object.values(json); + if (this.preset.cat !== undefined) { + let cats = {}; // category lookup + for (let i in json) { + let cat = json[i][3]; + if (!cats[cat]) cats[cat] = []; + cats[cat].push(i) + } + + rows = []; + let children = cats[this.preset.cat]; + for (let loop = 0; children.length && loop < 20; loop++) { + rows.push(...children); + children = children.map(cat => cats[cat]).filter(is => is).flat(); + } + rows = rows.map(row => json[row]).filter(row => row[2]); + } if (this.preset.level !== undefined) { rows = rows.filter(row => row[1] <= this.preset.level); } + + { + let cats = new Set(); + let subcats = rows.map(row => row[3]); // direct parents + for (let loop = 0; subcats.length && loop < 20; loop++) { + subcats.forEach(cat => cats.add(cat)); + subcats = subcats.map(row => json[row] && json[row][3]).filter(val => val); // recurse grandparents + } + rows = rows.filter(row => !cats.has(row[2])); // remove referenced categories + } return rows.shuffle(); } -- 2.30.0