Bonjour

Je débute en javascript mais au gré de recherches et de lecture de tutos, j'arrive à m'en sortir, sauf pour un truc. J'ai une liste de documents qui sont caractérisés par 2 critères (pour simplifier, un critère est une lettre (de A à I) l'autre un chiffre de 1 à 3).
Là ou je bloque, c'est que toutes les combinaisons de critères existent : j'ai des documents avec les critères A1, A2, A3, B1, B2, B3 ... Je n'arrive pas à comprendre comment structurer mes tables pour que la sélection des 2 critères ne me laissent le choix que des documents avec ces 2 critères.

Si quelqu'un pouvait m'aiguiller, ce serait sympa.

Merci


EDIT : avec ce que j'ai pu glâner, j'ai ce code :
Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
<html>
<head>
	<script type="text/javascript">
var tbl_corps = [
  {"code_corps": "1", "corps" : "1"},
  {"code_corps": "2", "corps" : "2"},
  {"code_corps": "3", "corps" : "3"},
  ];
 
var tbl_BAP = [
  {"code_bap": "bapA", "bap" : "A", "code_corps":"C1"},
  {"code_bap": "bapA", "bap" : "A", "code_corps":"C2"},
  {"code_bap": "bapA", "bap" : "A", "code_corps":"C3"},
  {"code_bap": "bapB", "bap" : "B", "code_corps":"C1"},
  {"code_bap": "bapB", "bap" : "B", "code_corps":"C2"},
  {"code_bap": "bapB", "bap" : "B", "code_corps":"C3"},
  {"code_bap": "bapC", "bap" : "C", "code_corps":"C1"},
  {"code_bap": "bapC", "bap" : "C", "code_corps":"C2"},
  {"code_bap": "bapC", "bap" : "C", "code_corps":"C3"},
  {"code_bap": "bapD", "bap" : "D", "code_corps":"C1"},
  {"code_bap": "bapD", "bap" : "D", "code_corps":"C2"},
  {"code_bap": "bapD", "bap" : "D", "code_corps":"C3"},
  {"code_bap": "bapE", "bap" : "E", "code_corps":"C1"},
  {"code_bap": "bapE", "bap" : "E", "code_corps":"C2"},
  {"code_bap": "bapE", "bap" : "E", "code_corps":"C3"},
  {"code_bap": "bapF", "bap" : "F", "code_corps":"C1"},
  {"code_bap": "bapF", "bap" : "F", "code_corps":"C2"},
  {"code_bap": "bapF", "bap" : "F", "code_corps":"C3"},
  {"code_bap": "bapG", "bap" : "G", "code_corps":"C1"},
  {"code_bap": "bapG", "bap" : "G", "code_corps":"C2"},
  {"code_bap": "bapG", "bap" : "G", "code_corps":"C3"},
  {"code_bap": "bapH", "bap" : "H", "code_corps":"C1"},
  {"code_bap": "bapH", "bap" : "H", "code_corps":"C2"},
  {"code_bap": "bapH", "bap" : "H", "code_corps":"C3"},
  {"code_bap": "bapJ", "bap" : "J", "code_corps":"C1"},
  {"code_bap": "bapJ", "bap" : "J", "code_corps":"C2"},
  {"code_bap": "bapJ", "bap" : "J", "code_corps":"C3"},
];
 
var tbl_sujet = [
  {"code_sujet": "S_C1_A_1", "code_corps" : "C1", "sujet":"1-A-2020"},
  {"code_sujet": "S_C1_A_2", "code_corps" : "C1", "sujet":"1-A-2021"},
  {"code_sujet": "S_C1_A_3", "code_corps" : "C1", "sujet":"1-A-2019"},
  {"code_sujet": "S_C2_A_1", "code_corps" : "C2", "sujet":"2-A-2020"},
  {"code_sujet": "S_C3_A_1", "code_corps" : "C3", "sujet":"2-A-2020"},
  {"code_sujet": "S_C1_B_1", "code_corps" : "C1", "sujet":"1-B-2020"},
  {"code_sujet": "S_C2_B_1", "code_corps" : "C2", "sujet":"2-B-2020"},
  {"code_sujet": "S_C3_B_1", "code_corps" : "C3", "sujet":"3-B-2020"},
  {"code_sujet": "S_C3_B_2", "code_corps" : "C3", "sujet":"1-B-2020"},
];
 
/**
* Fonction de récupération des données correspondant au critère de recherche
* @param   {String} condition - Chaine indiquant la condition à remplir
* @param   {Array}  table - Tableau contenant les données à extraire
* @returns {Array}  result - Tableau contenant les données extraites
*/
function getDataFromTable( condition, table) {
  // récupération de la clé et de la valeur
  var cde = condition.replace(/\s/g, '').split('='),
      key = cde[0],
      value = cde[1],
      result = [];
  
  // retour direct si *
  if (condition === '*') {
    return table.slice();
  }
  // retourne les éléments répondant à la condition
  result = table.filter( function(obj){
       return obj[key] === value;
    });
  return result;
}
 
/**
* Fonction d'ajout des <option> à un <select>
* @param   {String} id_select - ID du <select> à mettre à jour
* @param   {Array}  liste - Tableau contenant les données à ajouter
* @param   {String} valeur - Champ pris en compte pour la value de l'<option>
* @param   {String} texte - Champ pris en compte pour le texte affiché de l'<option>
* @returns {String} Valeur sélectionnée du <select> pour chainage
*/
function updateSelect( id_select, liste, valeur, texte){
  var oOption,
      oSelect = document.getElementById( id_select),
      i, nb = liste.length;
  // vide le select
  oSelect.options.length = 0;
  // désactive si aucune option disponible
  oSelect.disabled = nb ? false : true;
  // ajoute 1st option
  if( nb){
    oSelect.add( new Option( 'Choisir', ''));
    // focus sur le select
    oSelect.focus();
  }
  // création des options d'après la liste
  for (i = 0; i < nb; i += 1) {
    // création option
    oOption = new Option( liste[i][texte], liste[i][valeur]);
    // ajout de l'option en fin
    oSelect.add( oOption);
  }
  // si une seule option on la sélectionne
  oSelect.selectedIndex = nb === 1 ? 1 : 0;
  // on retourne la valeur pour le select suivant
  return oSelect.value;
}
 
/**
* fonction de chainage des <select>
* @param {String|Object} ID du <select> à traiter ou le <select> lui-même
*/
function chainSelect( param){
  // affectation par défaut
  param = param || 'init';
  var liste,
      id     = param.id || param,
      valeur = param.value || '';
      
  // test à faire pour récupération de la value
  if( typeof id === 'string'){
     param = document.getElementById( id);
     valeur = param ? param.value : '';
  }
 
  switch (id){
    case 'init':
      // récup. des données
      liste = getDataFromTable( '*', tbl_corps);
      // mise à jour du select
      valeur = updateSelect( 'CORPS', liste, 'code_corps', 'corps');
      // chainage sur le select lié
      chainSelect('CORPS');
      break;
    case 'CORPS':
      // récup. des données
      liste = getDataFromTable( 'code_corps=' +valeur, tbl_BAP);
      // mise à jour du select
      valeur = updateSelect( 'BAP', liste, 'code_bap', 'bap');
      // chainage sur le select lié
      chainSelect('BAP');
      break;
    case 'BAP':
      // affichage final
      document.getElementById('sujet').value = valeur;
      break;
  }
}
 
// Initialisation après chargement du DOM
document.addEventListener("DOMContentLoaded", function() {
  var oSelects = document.querySelectorAll('#liste select'),
      i, nb = oSelects.length;
  // affectation de la fonction sur le onchange
  for( i = 0; i < nb; i += 1) {
    oSelects[i].onchange = function() {
        chainSelect(this);
      };
  }
  // init du 1st select
  if( nb){
    chainSelect('init');
  }
});
 
</script>
</head>
<body>
 
<div id="liste">
  <p>
    <label>Sélectionner le corps</label>
    <select id="CORPS"></select>
  </p>
  <p>
    <label>Sélectionner la BAP</label>
    <select id="BAP"></select>
  </p>
  <p>
    <label>Sujet</label>
    <input id="sujet" readonly>
  </p>
</div>
</body>
</html>
mais rien n'est affiché dans les listes déroulantes