2017-10-19 5 views
0

J'ai un tableau de combinaisons de 5 caractères (ordre dans une combinaison ne joue aucun rôle):JavaScript - Y at-il un moyen de savoir si les caractères donnés sont contenus dans une chaîne sans boucle?

AB, ABDE, CDE, C, B ...

Sur cette base, je dois valider l'entrée de l'utilisateur. La combinaison de caractères entrée doit être contenue dans l'une des combinaisons du tableau. Si l'utilisateur entre "ADE" ou "CE", le résultat devrait être yes, si par ex. "BCE" - no.

Dans un cas trivial, lorsque la combinaison entrée correspond simplement à celle dans le tableau, je peux utiliser .inArray. Si la combinaison entrée est composée de voisins, je peux faire .indexOf. Comment être dans le cas ci-dessus? L'une des solutions consisterait à étendre le tableau initial en incluant toutes les combinaisons "enfant" possibles. Y a-t-il une alternative?

+0

Vous n'êtes pas certain de la logique? Quel est le résultat attendu pour "lorsque la combinaison entrée correspond simplement à celle dans le tableau" – guest271314

+0

Si la combinaison entrée est dans le tableau, le résultat est positif, l'entrée est validée, oui. C'est ce que j'appelle un cas trivial. –

+0

Voulez-vous dire que si "AB" 'et' "D" 'sont entrés, le résultat devrait être' oui'? Comme une correspondance est trouvée dans le tableau? L'entrée attendue, la logique d'appariement ou le résultat ne sont pas clairs. Pouvez-vous inclure le code que vous avez essayé de résoudre l'enquête à la question? Voir https://stackoverflow.com/help/mcve – guest271314

Répondre

1

La première chose à laquelle je pouvais penser est grep'ping le tableau avec une correspondance regex.

var haystack = ["BCED","DBCE","CEB","ECBA","CB","BDCA"]; 
 
var needle = "CBE"; 
 
var re = new RegExp("(?=.*" + needle.split('').join(")(?=.*") + ").{" + needle.length+"}"); 
 
console.log(re); 
 
console.log($.grep(haystack, function(str){ 
 
    return str.match(re,"g"); 
 
}));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

1

Je vais approfondir le commentaire que je l'ai fait à la quesion ci-dessus: Si vous avez un petit nombre d'éléments fixes fixes, vous pouvez représenter les ensembles comme des masques binaires. Supposons que vous ayez les jeux d'origine sous forme de chaînes:

var sset = ["AB", "ABDE", "CDE", "C", "BE"]; 

Créez un dictionnaire d'éléments et de bits possibles. Les bits sont des puissances de deux, ce qui peut être créé par bit décalage: 1 << n est peu n:

dict = { 
    A: (1 << 0), 
    B: (1 << 1), 
    C: (1 << 2), 
    D: (1 << 3), 
    E: (1 << 4), 
};  

Ce dictionnaire peut alors être utilisé pour créer le masque de bits:

function bitmask(s, d) { 
    let res = 0; 

    for (let i = 0; i < s.length; i++) { 
     res |= d[s[i]] 
    } 

    return res; 
} 

Créer un tableau d'accompagnement aux ensembles qui contient les masques:

var mset = sset.map(function(x) { return bitmask(x, dict); }); 

Si vous voulez vérifier une entrée, cnvert à un masque, puis exécutez les contrôles. Un ensemble s contient tous les bits d'une entrée x si (s & x) == x:

var s = "ADE"; 
var m = bitmask(s, dict); 
for (let i = 0; i < mset.length; i++) { 
    console.log(sset[i], s, (mset[i] & m) == m); 
} 

Vous pouvez utiliser cette stratégie pour plusieurs conditions:

(a & b) == b — tous les éléments de b sont contenus dans a;
(a & b) == 0a et b n'ont pas d'éléments communs;
(a & b) != 0 — au moins un élément de b est dans a; Les ensembles a et b sont identiques.

Dans le langage de jeu a & b est l'intersection, a | b est l'union et a^b est la différence symétrique de a et b. Pour autant que je sache, jQuery est une bibliothèque écrite en Javascript, donc tous les opérateurs bit-wise devraient être disponibles.