J'ai deux liste d'objets:O^2 de comparaison entre la liste des objets
list1 = [{value: 'X'}, {value: 'Y'}, ..., {value: 'Z'}];
list2 = [{value: 'A'}, {value: 'B'}, ..., {value: 'C'}];
J'ai ce code qui vérifie si les valeurs sont en list2
list1
. Si c'est le code ne fait rien, sinon il devrait ajouter à list1
(ceci va créer une nouvelle liste, list3
). Ce qui signifie que je fais une union entre les deux listes sans conserver les valeurs répétées.
for (let i = list2.length-1; i >= 0; i--) {
let item = list2[i];
let shared = false;
for (let j = list1.length-1; j >=0; j--) {
let childItem = list1[j];
if (item.value === childItem.value) {
shared = true;
break;
}
}
if (!shared) { newValues.push(item); }
}
list3 = list1.concat(newValues);
Cela fonctionne très bien, mais je me demandais si je pouvais améliorer ce O (n * m). Je ne suis pas sûr si les listes sont toujours triées par défaut, mais d'après ce que j'ai vu à la fois (list1 et list2) sont toujours triés par valeur.
Exemple:
var list1 = [{value: 'bar'}, {value: 'baz'}, {value: 'foo'}, {value: 'foz'}];
var list2 = [{value: 'bar'}, {value: 'foo'}, {value: 'test'}, {value: 'testz'}];
var list3 = union(list1, list2);
list3 = [{value: 'bar'}, {value: 'baz'}, {value: 'foo'}, {value: 'foz'}, {value: 'test'}, {value: 'testz'}];
Quand vous dites « si les valeurs liste2 sont en list1 » voulez-vous dire, le cas échéant, ou si toutes les valeurs? –
Je vais ajouter un exemple pour clarifier – mk2