2
votes

Comment faire la différence entre deux tableaux de chaînes?

Je veux obtenir la différence exacte entre deux tableaux de chaînes.

['E','E','R']

Tableau de sortie attendu:

const output = array1.filter(char => array2.includes(char));

J'ai essayé cette méthode :

['E','A','P','E','R']

Mais cela supprime toutes les instances d'un personnage, comme:

const array1 = ['T','E','A','P','A','P','E','R'];
const array2 = ['T','A','P'];

Je suis un débutant, donc je pourrais vous me guidez dans la bonne direction?


5 commentaires

Quel est le résultat pour ["A", "B"] ["B", "A"] ?


Doit être un tableau vide.


Pourquoi? Quelle est la logique derrière cela?


J'ai essentiellement un tableau de caractères de mots (array1). Si l'utilisateur tape quelque chose, le caractère est ajouté à un tableau de caractères utilisé. L'utilisateur n'est autorisé à taper que les caractères du tableau1 et si l'un d'eux est épuisé, il ne peut plus le saisir. Je dois donc avoir un tableau avec des caractères autorisés, que j'utilise pour le contrôle d'entrée.


Double possible de obtenir la différence entre deux tableaux (y compris les doublons)


3 Réponses :


1
votes

Je pense que le filtre n'est pas correct ici. Parce qu'il y a des éléments répétés. Utilisez une simple boucle for. Et supprimez les éléments lorsque vous l'ajoutez au résultat.

const array1 = ['T','E','A','P','A','P','E','R'];
const array2 = ['T','A','P'];
const copy = [...array2];

let res = [];
for(let i = 0;i<array1.length;i++){
  let index = copy.indexOf(array1[i]);
  if(index === -1){
    res.push(array1[i]);
  }
  else copy.splice(index,1);
  

}
console.log(res)


0 commentaires

6
votes

Vous pouvez fermer l'index du deuxième tableau, incrémenter l'index et supprimer cet élément de l'ensemble de résultats.

var array1 = ['T', 'E', 'A', 'P', 'A', 'P', 'E', 'R'],
    array2 = ['T', 'A', 'P'],
    set2 = new Set(array2)
    result = array1.filter(v => !set2.delete(v));

console.log(result);

Une approche différente sans ordre prédéfini de array2.

var array1 = ['T', 'E', 'A', 'P', 'A', 'P', 'E', 'R'],
    array2 = ['T', 'A', 'P'],
    result = array1.filter((i => v => array2[i] !== v || !++i)(0));

console.log(result);


2 commentaires

Selon les (nouvelles) spécifications du PO, l'ordre ne devrait pas avoir d'importance.


Merci beaucoup. Cela prendra du temps à digérer.



1
votes

Vous pouvez supprimer des éléments du autorisé en fonction du tableau input :

 const allowed = ['T','E','A','P','A','P','E','R'];
 const input = ['T','A','P'];

 for(const char of input) {
   const pos = allowed.indexOf(char);
   if(pos === -1) {
     // char doesnt exist?
   } else {
     allowed.splice(pos, 1);
   }
 }

Ensuite, allowed être votre résultat attendu à la fin.


2 commentaires

Merci! J'ai essayé de voter, mais je manque malheureusement de quelques points.


@fallc maintenant vous pouvez :)