optimiser la recherche par le biais de grandes js tableau de chaîne?
si j'ai un grand javascript tableau de chaîne qui a plus de 10 000 éléments,
comment puis-je rechercher rapidement à travers elle?
Droit maintenant, j'ai un javascript tableau de chaînes qui stocke la description d'un emploi,
et je"m permettant à l'utilisateur de filtre dynamique de la liste retournée en cours de saisie dans une zone de saisie.
Donc dire que j'ai un tableau de chaîne comme suit:
var descArr = {"flipping burgers", "pumping gas", "delivering mail"};
et l'utilisateur souhaite rechercher: "p"
Comment pourrais-je être en mesure de rechercher une chaîne de caractères tableau qui a 10000+ descriptions rapidement?
Évidemment, je ne peux pas trier la description du tableau, car ils sont des descriptions, de sorte que la recherche binaire. Et puisque l'utilisateur peut rechercher par "p"
ou "pi"
ou toute combinaison de lettres, de cette recherche partielle signifie que je ne peux pas utiliser de tableaux associatifs (c'est à dire searchDescArray["pumping gas"]
)
pour accélérer la recherche.
Toutes les idées de quelqu'un?
descArr n'est pas un tableau mais un littéral d'objet.
Oui, si l'utilisateur recherche pour "p", il devrait inclure la préparation de hamburgers" dans le résultat. Je trouve que le plus lent en bas à droite est maintenant la recherche proprement dite. Actuellement, j'ai un forloop qui parcourt le tableau et n'cette comparaison: si (descArray[i].recherche("P")) > -1){ //return result}
Le faire avec des RegExp - exemple: jsfiddle.net/RnabN/4 (30k chaînes, max 100 résultats)
OriginalL'auteur TriFu | 2010-10-20
Vous devez vous connecter pour publier un commentaire.
Comme expression régulière moteurs réels de navigateurs vont noix en termes de vitesse, de façon à le faire de cette façon? Au lieu d'un tableau de passer une gigantesque chaîne et de séparer les mots par un identifiant.
Exemple:
"flipping burgers""pumping gas""delivering mail"
"([^"]*ping[^"]*)"
Avec le commutateur
/g
pour le mondial, vous obtenez tous les matchs. Assurez-vous que l'utilisateur n'a pas de recherche pour votre chaîne séparateur.Vous pouvez même ajouter un id dans la chaîne de caractères avec quelque chose comme:
"11 flipping burgers""12 pumping gas""13 delivering mail"
Regex:
"(\d+) ([^"]*ping[^"]*)"
Exemple: http://jsfiddle.net/RnabN/4/ (30000 cordes, de limiter les résultats à 100)
Moderne de l'expression régulière runtimes sont presque aussi rapidement qu'un fichier programme en c++. Il y a de la performance des mondes, entre le vieux javascript (la version 2 de firefox/netscape, internet explorer) et le nouveau juste-à-temps des implémentations. JavaScript sur un pc moyen avec chrome exécute plusieurs fois plus rapide que le JavaScript sur un pc haut de gamme avec internet explorer.
Cela a fonctionné exactement comme annoncé. Je vous remercie.
Juste un heads-up pour les futurs utilisateurs avertis. Lors de la modification de votre jsfiddle exemple d'accepter également le numéro d'identification, le nombre de caractères doit être double échappement: new RegExp('"(\\d+) ([^"]*'+recherche+'[^"]*)"','gi')
Bonjour pouvez-vous svp me dire comment convertir un grand tableau dans "gigantesque chaîne" dans votre plunker merci, je vais donner un upvote si vous m'aidez, votre réponse est belle, sans doute, mais la conversion de tableau permettra également de prendre un peu de temps pouvez-vous pls fournir démo?
OriginalL'auteur sod
Il n'y a pas moyen d'accélérer un initiale tableau de recherche sans faire des changements. Vous pouvez accélérer consequtive les recherches par la mise en cache des résultats et leur mise en correspondance de modèles de dynamique.
1.) Ajuster votre format de données. Cela rend initiale des recherches un peu plus rapide. Fondamentalement, vous préalablement mis en cache.
2.) Installation du cache de la mécanique.
3.) Utiliser le script suivant pour créer un objet préalablement mis en cache. Je vous suggère d'exécuter une seule fois et l'utilisation de JSON.stringify pour créer un statique objet cache. (ou le faire sur le backend)
Probablement un peu plus de code que vous avez prévu, mais l'optimalisation et la performance ne vient pas gratuitement.
OriginalL'auteur BGerrissen
Cela peut ne pas être une réponse pour vous, en tant que je suis en train de faire des suppositions au sujet de votre installation, mais si vous avez le code côté serveur et une base de données, vous feriez beaucoup mieux de faire un appel AJAX en arrière pour obtenir la coupe vers le bas de la liste de résultats, et à l'aide d'une base de données pour faire le filtrage (comme ils sont très bons pour ce genre de chose).
Ainsi que la base de données de prestations, vous pouvez également bénéficier de pas pour la sortie de cette quantité de données (10000 variables) à un basé sur le web front-end - si vous retourner uniquement ceux dont vous avez besoin, alors vous économiserez un peu juste de la bande passante.
Un index de texte intégral ne serait pas nécessaire pour cela. Sur le Serveur SQL d'une requête avec des OÙ le titre comme 'P%' serait encore SARGable et serait d'utiliser un index sur cette colonne si l'on était présent. Il est aussi plus rapide car vous n'êtes pas transmettre tous les 10000 à travers le fil pour le client avant le traitement, seule la coupe vers le bas de la liste.
Après avoir réfléchi pendant 3 ans, qui est votre meilleur riposte? %P% n'est pas sargable, et je crois que c'est le sens voulu.
Drôle, nous venons de signaler ce commentaire hier... %p% n'est pas sargable, mais je crois que p% est. Vous l'esprit quand j'ai lu la question, je vois que je me trompe...
OriginalL'auteur Paddy
Je ne peux pas reproduire le problème, j'ai créé une implémentation naïve, et la plupart des navigateurs ne la recherche à travers 10000 15 char chaînes de caractères dans un seul chiffre le nombre de millisecondes. Je ne peux pas tester dans IE6, mais je ne crois pas qu'il à plus de 100 fois plus lent que les navigateurs les plus rapides, ce qui serait encore quasiment instantanée.
Essayez-le vous-même: http://ebusiness.hopto.org/test/stacktest8.htm (à Noter que le temps de création n'est pas pertinent pour la question, qui est juste là pour obtenir des données pour travailler sur.)
Une chose que vous pourriez faire de mal, c'est d'essayer de rendre tous les résultats, ce serait tout à fait un travail énorme lorsque l'utilisateur a entré dans une seule lettre, ou une lettre commune combinaison.
OriginalL'auteur aaaaaaaaaaaa
Je vous propose d'essayer un prêt à JS de fonction, par exemple la
autocomplete
de jQuery. Il est rapide et il dispose de nombreuses options à configurer.Découvrez la jQuery autocomplete démo
OriginalL'auteur medopal