2010-12-12 15 views
1

Il y a beaucoup d'exemples disponibles sur la façon de trier un tableau javascript en fonction de ses valeurs numériques. Quel serait cependant le moyen approprié pour aller chercher tous les éléments de myArray avec la propriété prop1 avec la valeur value1?Javascript: Filtrer un tableau bidimensionnel

Voici mon tableau:

var myArray = [ 
{ 
    "id":"2", 
    "name":"My name", 
    "properties":{"prop1":"value1"} 
}]; 

Merci

Répondre

2

Vous pouvez simplement y accéder par point ou notation de support et pousser les membres correspondants à votre n ew/tableau filtré, par exemple:

var newArray = []; 
for(var i=0, l = myArray.length; i<l; i++) { 
    if(myArray[i].properties.prop1 == "value1") newArray.push(myArray[i]); 
} 

Votre question est un peu ambiguë cependant, si vous essayez d'obtenir l'objet {"prop1":"value1"}, pas le parent, puis juste changer newArray.push(myArray[i])-newArray.push(myArray[i].properties).

+0

Solution vraiment propre. Merci beaucoup! – Industrial

+0

Salut Nick - S'il vous plaît jeter un oeil ici; http://stackoverflow.com/questions/4433004/jquery-js-sorting-array-based-upon-another-array – Industrial

1

Fournir une fonction de comparaison pour trier par des propriétés arbitraires:

function compareMyObjects(a, b) { 
    var valA = a.properties.prop1.value1; 
    var valB = b.properties.prop1.value1; 

    if(valA > valB) return 1; 
    if(valA < valB) return -1; 
    return 0; 
} 

myArray.sort(compareMyObjects); 

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort

+0

Cette * sortes * le tableau, non le filtre, aussi 'prop1' est une chaîne, donc vous avez passé une propriété trop loin dans le tri :) –

0

Parcourez chaque élément de votre tableau. Pour chaque élément, vérifiez chaque propriété pour voir si elle correspond à celle que vous recherchez.

function filterArray(array, property, value) { 
    var newArray = []; 
    for (var i = 0; i < array.length; i++) { 
     for (var j in array[i].properties) { 
      if (j === property && array[i].properties.hasOwnProperty(j)) { 
       if (array[i].properties[j] == value) { 
        newArray.push(array[i]); 
       } 
      } 
     } 
    } 
} 
+0

Cela ne vérifie pas la valeur nulle part, il pousse simplement tous les nouveaux objets dans un nouveau tableau, plusieurs fois aussi s'il y a plus d'une propriété pour enfants. –

+0

L'a corrigé. J'ai réalisé mon erreur juste après l'affichage. – mdarwi

+0

pourquoi boucler quand vous pouvez accéder directement à la propriété? :) –

0
var newarray=myarray.filter(function(itm){ 
    return itm.properties.prop1==='value1'; 
}); 

filtre, comme les méthodes de tableau indexOf et carte, peut être utile de fournir pour les navigateurs qui n'ont pas it- cette version est de Mozilla Developer SITE-

if(!Array.prototype.filter){ 
    Array.prototype.filter= function(fun, scope){ 
     var L= this.length, A= [], i= 0, val; 
     if(typeof fun== 'function'){ 
      while(i< L){ 
       if(i in this){ 
        val= this[i]; 
        if(fun.call(scope, val, i, this)){ 
         A[A.length]= val; 
        } 
       } 
       ++i; 
      } 
     } 
     return A; 
    } 
} 
Questions connexes