2010-09-02 5 views
1

Comment rechercher la propriété d'un objet dans un tableau sans utiliser les boucles for en JavaScript?Recherche d'objets dans les tableaux JavaScript

Si le tableau est un tableau simple, je peux utiliser array.indexOf(value) pour obtenir l'index, mais que se passe-t-il si le tableau est un tableau d'objets? Autre que de boucler d'une autre manière?

Par exemple, ar = [{x,y},{p,q},{u,v}]. Si vous recherchez v, il doit renvoyer l'index de la table sous la forme 2.

Répondre

3

La recherche d'une valeur dans une matrice nécessite généralement un sequential search, ce qui nécessite de faire une boucle sur chaque élément jusqu'à ce que vous trouviez une correspondance.

function search(ar, value) { 
    var i, j; 
    for (i = 0; i < ar.length; i++) { 
    for (j in ar[i]) { 
     if (ar[i][j] === value) return i; 
    } 
    } 
} 

search([{'x': 'y'}, {'p': 'q'}, {'u': 'v'}], 'v'); // returns 2; 
+0

Oui, de cette façon, je comprends. Je pensais que s'il y avait des fonctions intégrées pour faire la recherche, comme nous pouvons trier un tableau en fonction de la propriété des objets en utilisant array.sort() et comparer la fonction. – sat

+0

@sat: Pas vraiment. Voici les méthodes disponibles pour Arrays: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array. En JavaScript 1.6, il y a la méthode 'filter()', mais cela serait encore trop complexe pour vos besoins. –

+0

Merci pour l'information. – sat

0

Searching for objects in JavaScript arrays

javascript: 
    /* quick fix naive short solution to be posted soon */ 
    /* array of objects with primitive property values only and no wrinkles */ 

.

javascript: 
    alert(
     JSON.stringify(
     [{x:1,y:2},,,{p:"q"},{u:{},vx:[],x:{y:{},x:5}}] 
      ) . match(/"x":/g) 
    ) 

et

javascript: /* Does the need to fortify this code imply JSON is stronger? */ 
    alert(           /* See wrinkles below */ 
     [{x:1,y:2},,,{p:"q"},{u:{},vx:[],x:{y:{},x:5}}] . toSource() . 
/* 
     match(/({|,)\s*x:/g) . join() . replace(/({|,)\s*x:/g,"x:") 
    finds `x:,x:,x:` 
*/ 
     replace(/(({|,)\s*)([^,{:]*):/g,'$1"$3":') . match(/"x":/g) 
    ) 

trouver "x":,"x":,"x":.

Propriété spécifique trouvée, fait affaire?

Conseil, indice (mais doit être convenablement atténuées et amputées pour les animaux imbriqués):

javascript: 
    alert(
     JSON.stringify([{x:1,y:2},{p:"q"},{u:{},v:[],x:{y:{},x:5}}]) . 
      match(/"[^"]*":/g) 
    ) 

trouve "x":,"y":,"p":,"u":,"v":,"x":,"y":,"x": (? Toutes les propriétés - Fait maintenant)

Plus (beaucoup plus) la douleur de déformation du cerveau trouvera les valeurs x: et l'index des positions de tableau (nombre de compteurs de haut niveau ,).

ampute et atténuer soupçon (ne supprime tableau imbriqué et objet , « s, voir les rides):

javascript:debug=false; 
    animal=[ 
     {x:1,y:2},,,{p:"q"}, 
     [ {u:{},vx:[,,], x:{y:{xx:''},x:5} }, "hmmm comma x colon \" monster" ], 
    ]; 
    animal=animal.toSource().replace(/\[(.*)]/,"$1"); 
/* */ if(debug){ 
    alert(animal); 
    animal=animal.replace(/\[([^[\]]*)\]/g, 
       function(a,b,c,d){alert([a,b,c,d].join("\n\n"));return a}); 
    while(animal.search(/\{.*\}|\[.*\]/)>-1){ 
     animal=animal.replace(/\{([^{}]*)\}|\[(.*)\]/g, 
     function(a,b,c,d){alert([a,"\n",b,"\n",c]);return b.replace(/,/g,";")}); 
     alert(animal); } 
/* */ } 

    /* the while loops on nesting depth not top array length */ 
    while(animal.search(/\{.*\}|\[.*\]/)>-1) 
     animal=animal.replace(/\{([^{}]*)\}|\[(.*)\]/g,  /* implicit g loop */ 
        function(a,b,c,d){return (b+c).replace(/,/g," ")}); /* ditto */ 
    alert(animal); /* as opposed to a non-lert animal? */ 

Wrinkles:

  • .toSource() est plus forte (mais ... voir ci-dessus) et gère plus de situations que JSON
    ref: Implementing Mozilla's toSource() method in Internet Explorer

  • et s'il y a des monstres avec des chaînes contenant:
    1. , 's. . . un péché . . . [",,or",,{p:"1,2,3,"}]
    2. {x:...} ou {"x":...}. . . un péché . . . ['{"x":...}'," and ","{x:...}",,]
      (qui bousiller ci-dessus de codage utilisant JSON ou toSource)
    3. monstres imbriqués
    4. autres monstruosités ne sont que ... chimèrespas assez payé pour faire ou prouver