6
votes

Sélecteurs JQuery pour des objets javascript simples au lieu d'éléments DOM

Je viens de commencer à utiliser JQuery et je profite vraiment d'utiliser des sélecteurs. Il me semble que l'idiome serait une très bonne façon de traverser des arbres d'objets (par exemple, des résultats de la requête JSON). Par exemple, si j'ai un objet comme celui-ci:

var obj = { 'foo': 1, 'bar': 2,
            'child': { 'baz': [3, 4, 5] }
          };


2 commentaires

Y a-t-il une raison pour que vous n'aimez pas obj.child.baz [obj.child.baz.length-1]; ?


Cela fonctionnerait pour cet exemple de jouet, mais se décompose rapidement pour des arbres plus profonds et des objets plus importants. Par exemple, je travaille sur un programme qui utilise un arbre représentant des paquets réseau, et j'aimerais pouvoir simplement écrire $ ('ICMP [code = inaccessible]', la liste de paquets) pour obtenir les cadres ICMP pour des paquets inaccessibles.


4 Réponses :


0
votes

L'objet Array a des méthodes que vous pouvez utiliser:

first = obj.child.baz.slice(0,1)[0];
allExceptFirst = obj.child.baz.slice(1);
allExceptLast = obj.child.baz.(0,-1);


1 commentaires

Merci. Oui, c'est à peu près ce que je fais maintenant. Mais les sélecteurs sont beaucoup plus puissants à mon avis, car vous n'avez pas besoin de connaître la forme exacte de l'objet particulier que vous marchez pour trouver des éléments intéressants. Je pense qu'il y a une bonne raison JQuery ne vous fait pas faire HTML.body.Table [1] .TR ...



0
votes

Eh bien, je dirais personnellement que l'accès de l'objet pur a l'air mieux que les requêtes de type JQuery. Une chose qui serait soignée serait tranchée et d'autres techniques de filtrage.

Si vous vouliez vraiment jouer avec des requêtes d'accès à l'objet, vous seriez certaines possibilités (pensez XPath): P>

var obj = {
    foo: 1,
    bar: 2,
    child: {
        foo: {
            baz: [3, {a: 1}, {a: 2, b: 3}]},
        bar: {
            baz: [42, {a: 123}, {a: -1}]},
        baz: null}};

// Implicitly start in the Global object, unless a context is provided.
// Keys in JavaScript objects are essentially stored in order (not valid for
// *all* flavors, but it's close to standard. So you could do slicing on keys.)

// Selects (does not return them)
// obj.child.foo.baz[1].a
// obj.child.foo.baz[2].a
// obj.child.bar.baz[1].a
// obj.child.bar.baz[2].a
// Then performs an aggregate that returns value 125.
$('obj.child[:2].baz[1:].a').sum()

// Selects obj.foo, obj.bar, obj.child.foo.baz[0] and obj.child.bar.baz[0]
$('obj *[typeof(number)]')

// Selects obj.foo and obj.child.foo
$('obj foo')

// Other possible methods: delete(), set(), get() (as an array of values),
// min(), max(), avg(), merge() etc etc.


0 commentaires

5
votes

Voici une implémentation de la preuve de concept pour que JQuery se travaille sur des objets. Via un wrapper d'objet ( fabenode ), vous pouvez tromper JQuery à l'aide de son moteur de sélecteur intégré (grésillement) sur des objets javascript simples: xxx

et l'utilisation serait être: xxx

donnant la sortie: xxx

bien sûr, vous devez mettre en œuvre beaucoup plus que le Vous avez ci-dessus pour supporter plus de sélecteurs complexes.

BTW, avez-vous vu JLLOQ ?


1 commentaires

C'est une réponse très intéressante.



0
votes

Le moyen le plus simple et le plus simple consiste à envelopper l'élément avec jQuery puis boucle par chaque xxx


0 commentaires