2013-02-25 7 views
0

J'ai une fonction JavaScript:Chaîne robuste de Split

function doSomething(arg) { 
    var array = arg.split(','); 
    // etc... 
} 

arg est peuplée en utilisant la fonction .data('myId') jQuery.

Souvent, myId contient une liste d'entiers séparés par des virgules et le code fonctionne très bien. Toutefois, si myId ne contient un seul entier, le code échoue avec l'erreur

objet ne supporte pas la propriété ou méthode « scission »

Y at-il une méthode compacte, robuste pour créer le tableau sans inclure if instructions pour gérer les conditions aux limites d'un entier ou d'une chaîne vide?

Répondre

1

Vous avez deux problèmes indépendants. Le premier est pour le cas d'une chaîne vide: Split retournera un tableau à un élément avec une chaîne vide. Juste vérifier pour cela et compenser.

var array; 
if (arg == "") array = []; 

S'il y a un seul entier, je crois que vous ne recevez pas une chaîne de la .data(), mais un nombre entier réel; donc d'abord le convertir en une chaîne:

else array = String(arg).split(','); 

Alternativement, vous pouvez simplement éviter la magie jQuery, et accéder à l'attribut directement - tous les attributs data() ne sont que des attributs avec data- préfixé.

2

attr retournera une chaîne, tandis que data essaiera d'analyser la valeur et retournera un objet avec le type "correct".

foo.attr('data-myId'); //pass this instead 

Vous ne pouvez pas vous déplacer d'identifier une chaîne vide sans if cependant. Vous devez soit vérifier pour cela, ou pour un tableau avec un seul élément de chaîne vide.

1

.data va essayer de deviner le type de la valeur en fonction de son contenu, de sorte qu'il devienne un nombre. Vous pouvez utiliser .attr, qui renvoie toujours une chaîne si elle est disponible en tant qu'attribut. Alternativement, cast à une chaîne:

('' + arg).split(',') 
//or 
String(arg).split(',') 

Je ne suis pas sûr si on est préféré ou non.

Notez également que ''.split(',') renvoie [''] ou un tableau avec un élément de chaîne vide. Vous pouvez contourner cela avec .filter(function (elem) { return elem !== ''; })

Une autre alternative possible est d'utiliser dataset sur l'élément lui-même.