2010-04-06 5 views
2

J'essaie d'utiliser la fonction jQuery $.inArray pour itérer à travers un tableau et s'il y a un élément dont le texte contains un mot-clé particulier, supprimer cet élément. $.inArray renvoie uniquement l'index de tableau si le texte de l'élément est equal au mot-clé.jQuery Le tableau Javascript 'contient' des fonctionnalités?

Par exemple donné le tableau suivant nommés « jetons »:

- tokens {...} Object 
    [0] "Starbucks^25^http://somelink" String 
    [1] "McDonalds^34^" String 
    [2] "BurgerKing^31^https://www.somewhere.com" String 

Et un appel à removeElement(tokens, 'McDonalds'); renverrait le tableau suivant:

- tokens {...} Object 
    [0] "Starbucks^25^http://somelink" String 
    [1] "BurgerKing^31^https://www.somewhere.com" String 

Je devine que cela peut être possible en utilisant la jQuery $.grep ou $.each fonction, ou peut-être regex. Cependant, je ne suis pas assez familier avec jQuery pour accomplir ceci.

Toute aide serait appréciée!

Répondre

4

grep est en effet la voie à suivre.

function removeElement(array, keyword) { 
    return $.grep(array, function (item, i) { 
     return item.indexOf(keyword) > -1; 
    }, true); 
} 

Ceci recherche le mot-clé en tant que sous-chaîne. Si les éléments du tableau ont un format particulier (auquel ils semblent appartenir, mais cela n'est pas certain), modifiez le test pour qu'il corresponde au format.

function removeElement(array, keyword) { 
    var keyRE=new RegExp('^'+keyword+'^'); 
    return $.grep(array, function (item, i) { 
     return keyRE.test(item); 
    }, true); 
} 

Notez le premier «^» est un méta-caractère correspondant au début de la chaîne; la seconde correspond simplement à un caractère '^'.

+0

Je pense qu'il veut que le tableau de résultat ne contienne que des choses qui ** n'ont pas ** le mot-clé. – Pointy

+0

Pointy a raison. Bien que si la première fonction removeElement que vous avez créée a renvoyé l'index de tableau au lieu de l'élément, cela fonctionnerait aussi? – YourMomzThaBomb

+0

@YourMomzThaBomb: dans la première version (en fait, les deux), l'index du tableau est ignoré. 'a.indexOf (b)' retourne l'index de départ de la chaîne 'b' dans la chaîne' a', ou -1 si 'b' n'est pas une sous-chaîne de' a'. – outis

0

éditer oups J'ai totalement mal compris la question.

bien $.grep prend un "inverser" drapeau, de sorte que vous pouvez l'utiliser directement:

var pattern = /\bword\b/; 
var newArray = $.grep(oldArray, function(e) { return pattern.test(e); }, true); 

Bien sûr, maintenant que j'y pense, je pourrais sauver 5 caractères:

var newArray = $.grep(oldArray, function(e) { return !pattern.test(e); }); 
0

Cela devrait être clair en soi. Supprime tous les éléments du paramètre tokens qui contiennent la chaîne transmise dans le paramètre search. En utilisant filter()

function removeElement(tokens, search) { 
    var regex = new RegExp(search); 
    return $(tokens).filter(function() { 
     return !regex.test(this); 
    }).toArray(); 
} 

Si vous voulez, vous pouvez également spécifier des drapeaux pour la regex

par exemple

var regex = new RegExp(search, "i"); 

supprimerait tous les éléments qui contiennent la chaîne de recherche avec le cas ignoré


Version $.grep du code

function removeElement(tokens, search) { 
    var regex = new RegExp(search); 
    return $.grep(tokens, function(elem, ind) { 
     return regex.test(elem); 
    }, true); 
} 
+0

La construction d'une nouvelle instance RegExp pour chaque itération semble un gaspillage. – Pointy

+0

corrigé déjà ... – jitter

Questions connexes