2010-05-13 10 views
6

Comment triez-vous un tableau multidimensionnel en JavaScript?Tri d'un tableau multidimensionnel en javascript

J'ai un tableau complet de tableaux contenant deux dates et une chaîne. J'ai besoin du tableau principal trié par l'un des tableaux de date, est-ce possible?

stucture de données:

events = [ 
{ date 1, date 2, string }, 
{ date 2, date 2, string }, 
] 

Répondre

13

en double de sort outer array based on values in inner array, javascript ici, vous trouverez plusieurs réponses, comme mes propres

var arr = [.....] 
arr.sort((function(index){ 
    return function(a, b){ 
     return (a[index] === b[index] ? 0 : (a[index] < b[index] ? -1 : 1)); 
    }; 
})(2)); // 2 is the index 

Ce genre sur index 2

+0

+1 Je sais que c'est un vieux post mais c'est une réponse géniale et ça m'a aidé à résoudre un problème avec mon propre plugin de tri de table personnalisé que je fais :) – defaultNINJA

3

La structure du tableau semble un peu vague de votre description. Vous pouvez utiliser une fonction de tri personnalisée pour comparer les éléments et effectuer le tri.

En supposant que la structure est la suivante:

var data = [ 
    [date11, date12, string], 
    [date21, date22, string], 
    [date31, date32, string], 
    ... 
]; 

Si vous aviez des objets au lieu de tableaux imbriqués, vous auriez pas besoin d'utiliser des index numériques. Ici a[0] et b[0] sont utilisés pour comparer le premier élément dans deux tableaux imbriqués (en supposant que c'est la date que vous voulez trier). En outre, en supposant que [0] et b [0] sont déjà des objets de Date - vous devrez peut-être créer les objets Date s'ils ne le sont pas déjà.

Mise à jour: Merci à @maerics pour le signaler. La valeur de retour du comparateur doit être [négative, 0, positive] correspondant à [a < b, a == b, a> b] valeurs.

function sortByDate(a, b) { 
    return a[0].getTime() - b[0].getTime(); 
} 

data.sort(sortByDate); 
+2

Vous voulez probablement dire 'return a [0] .getTime() - b [0] .getTime()' puisque le comparateur doit retourner (neg, zero, pos) en fonction de if (a b), n'est-ce pas? – maerics

+0

Oui, merci pour la correction :) – Anurag

+0

Il est inutile d'utiliser getTime(). a - b aura pour résultat a.valueOf() et b.valueOf() étant utilisé derrière les scènes, ce qui renvoie le temps unix –

1

Cet exemple permet de trier des tableaux par des nombres (et des dates) ou des chaînes.

Array.prototype.deepsort= function(){ 
    var i, order= arguments, L= order.length, tem; 
    return this.sort(function(a, b){ 
     i= 0; 
     while(i < L){ 
      tem= order[i++]; 
      var ao= a[tem] || 0, bo= b[tem] || 0; 
      if(ao== bo) continue; 
      return ao> bo? 1: -1; 
     } 
     return 0; 
    }); 
} 

var a= [ [ 'z', 1, 0 ], [ 'a', 0, 1 ],['m',-1,10] ,['a','1',-1]]; 

alert(a.deepsort(0,1,2)+'\n\n'+a.deepsort(2,0,1)) 

Trie sur l'index sélectionné (transmis en tant qu'argument).

Si les éléments de cet index dans chaque tableau correspondent, trie sur l'index suivant passé en argument, le cas échéant.

Continuez aussi longtemps que les éléments correspondent et qu'il y a plus d'arguments.

Vous n'avez pas besoin de spécifier plus d'un index pour trier par

a.deepsort(0); 
a.deepsort(2); 
+0

Fonctionne bien dans Chrome. 'this.sort' renvoie une erreur dans Firefox. –

Questions connexes