Supprimer des éléments de tableau avec de jonction pour la boucle
Je veux mettre en œuvre une sorte de jQuery live search.
Mais avant d'envoyer les données d'entrée du serveur, je voudrais supprimer tous les éléments dans mon tableau qui ont 3 ou moins de personnages (parce que dans la langue allemande, ces mots peuvent généralement être ignorées en termes de recherche)
Donc ["this", "is", "a", "test"]
devient ["this", "test"]
$(document).ready(function() {
var timer, searchInput;
$('#searchFAQ').keyup(function() {
clearTimeout(timer);
timer = setTimeout(function() {
searchInput = $('#searchFAQ').val().match(/\w+/g);
if(searchInput) {
for (var elem in searchInput) {
if (searchInput[elem].length < 4) {
//remove those entries
searchInput.splice(elem, 1);
}
}
$('#output').text(searchInput);
//ajax call here
}
}, 500);
});
});
Maintenant, mon problème est que pas tous les éléments sont supprimés dans ma boucle for.
Si j'ai par exemple typ "ceci est un test" "est" est supprimée, "une" reste.
JSFIDDLE
Je pense que le problème est pour la boucle parce que les indices de la matrice de changement si je supprime un élément avec l'épissure, donc, il va avec le "mauvais" index.
Peut-être quelqu'un pourrait m'aider?
- Je ne vois pas pourquoi ce ne devrait pas être fait côté serveur. Rappelez-vous, il est toujours possible que JavaScript soit désactivé par l'utilisateur.
- Vous avez raison, mais les deux façons devrait être possible. Serveur et côté client.
- Quel est l'avantage de le faire côté client, si? Vous êtes seulement enlever une douzaine de caractères avant de les transférer à la chaîne de recherche, et que vous allez répéter la vérification côté serveur, de toute façon. Cela est valable uniquement si vous souhaitez retourner des erreurs de l'utilisateur avant de l'envoyer.
- Eh bien, j'ai aussi pensé à cela, mais disons que c'est plus comme un exercice pour moi. En fait, il est plus intelligent de laisser le serveur faire le travail, mais j'ai commencé et je voulais une solution de travail 😉
Vous devez vous connecter pour publier un commentaire.
Solution 1
Vous pouvez faire une boucle à l'envers, avec quelque chose comme ce qui suit:
DÉMO: http://jsfiddle.net/KXMeR/
C'est parce que l'itération progressivement par le biais de la matrice, lorsque vous splice, le tableau est modifié, de sorte que les éléments sont "décalés" et vous vous retrouvez le saut de l'itération de certains. Boucle vers l'arrière (avec un
while
ou même unfor
boucle) résout ce parce que vous n'êtes pas en boucle dans la direction que vous êtes épissage.Solution 2
Dans le même temps, il est généralement plus rapide pour générer un nouveau tableau au lieu de modifier un en place. Voici un exemple:
où
newSearchInput
ne contiennent validité de la longueur des articles, et vous avez encore les éléments d'origine danssearchInput
.DÉMO: http://jsfiddle.net/RYAx2/
Solution 3
En plus pour la deuxième solution ci-dessus, un semblable, de nouveaux
Array.prototype
méthode est disponible pour le gérer mieux:filter
. Voici un exemple:DÉMO: http://jsfiddle.net/qky7D/
Références:
Array.prototype.filter
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filterArray.prototype.filter
prise en charge du navigateur - http://kangax.github.io/es5-compat-table/#Array.prototype.filtersplice
est un peu plus lent (que vous ne voyez pas la différence de vitesse à moins que ce code a couru plusieurs fois rapidement sur un immense tableau).looping in the direction you're splicing
concept étonnant.i
doit être pré-décrémenté? Je pense, c'est la façon dont il a travaillé pour moi.Énoncé du problème:
maintenant 3 se déplace à la deuxième position et la longueur est réduite de 1 qui crée problème.
Solution: Une solution simple serait de l'itération dans le sens inverse lors de l'épissage.
Si vous avez la lodash installé la librairie, ils ont un doux bijou que vous pourriez envisager.
La fonction est _.forEachRight (itère sur les éléments d'une collection à partir de la droite vers la gauche)
Ici est un exemple.
Vous pouvez également utiliser $.grep fonction pour filtrer un tableau:
http://jsfiddle.net/dfsq/4Wdp9/
Une autre approche serait de décrémenter l'index à chaque fois que vous tranche de tableau (x--), de sorte que lorsque le tableau devient décalée vers le bas de l'élément suivant à ne pas avoir sauté.
DÉMO: https://jsfiddle.net/alinaeem229/n2kq3690/1/