2014-05-25 4 views
0

J'essaye de trier ce tableau sur vCount (descendant) mais je n'arrive pas à comprendre comment le faire. J'ai cherché le débordement de pile mais je ne peux pas trouver quelque chose semblable à mon issue.Tri par groupes de dimensions multiples Javascript

C'est ce que j'ai trouvé jusqu'ici, je suppose que cela ne fonctionne pas parce que vCount est plus profond dans le tableau mais comment approfondir le tableau dans la fonction de tri?

var nar = trck_urls.sort(function(a, b){ // trck_urls is the array 
    return b['vCount'] - a['vCount']; 
}); 

C'est le tableau que je suis en train de trier. (Sortie console.log)

[ '/home': [ pageTitle: 't1', 
    Visitors: [ 'oPc-Gr6SYxN1AMyw8Pst' ], 
    vCount: 1 ], 
    '/dash': [ pageTitle: 't2', 
    Visitors: [ 'jepoSdBR9_ur3XSu8Psu', 'WIO4fEt1Ue8yHCly8Psv' ], 
    vCount: 2 ] ] 
+0

Le tableau contient une syntaxe d'objet invalide, ne peut pas trier un objet – charlietfl

+0

FYI [À propos du tri des objets] (http://stackoverflow.com/q/21027971/1959948) – Dalorzo

+0

Si c'est la sortie de 'console.log' , vous avez [abusé des tableaux JavaScript] (http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/). Si c'est votre script, alors vous avez une erreur de syntaxe. – Bergi

Répondre

0

Je vous suggère de contraindre votre structure de données en quelque chose de facilement classable comme ceci:

var trck_urls = [ 
    { path:'/home', 
    pageTitle: 't1', 
    Visitors: ['oPc-Gr6SYxN1AMyw8Pst'], 
    vCount: 1 }, 
    { path:'/dash', 
    pageTitle: 't2', 
    Visitors: ['jepoSdBR9_ur3XSu8Psu', 'WIO4fEt1Ue8yHCly8Psv' ], 
    vCount: 2 } 
]; 

var sorted = trck_urls.sort(function(a,b){ 
    return b.vCount - a.vCount; 
}); 

Si vous avez besoin de stocker les données comme un objet, vous pouvez forcer l'objet dans un tableau à chaque fois que vous avez besoin de faire le tri, comme ceci:

var sortUrls = function(dict){ 
    return Object.keys(dict).map(function(key){ 
     var item = dict[key]; 
     item.path = key; 
     return item; 
    }).sort(function(a, b){ 
     return a.vCount - b.vCount; 
    }); 
} 

var trck_urls = { 
    '/home' : { 
     pageTitle: 't1', 
     Visitors: ['oPc-Gr6SYxN1AMyw8Pst'], 
     vCount: 1 }, 
    '/dash' : { 
     pageTitle: 't2', 
     Visitors: ['jepoSdBR9_ur3XSu8Psu', 'WIO4fEt1Ue8yHCly8Psv' ], 
     vCount: 2 } 
}; 

var sortedUrls = sortUrls(trck_urls); 

Dans ce cas, Object.keys() GIV es vous la liste

['/home', '/dash'] 

et carte vous permet de remplacer chacune de ces touches avec les données correspondantes, ainsi l'objet de contraindre d'origine à un tableau. Ensuite, le tableau peut être trié.

+0

Salut Eric, j'aime une structure comme celle-ci mais je dois pouvoir obtenir le vCount, Visitors et pageTitle par chemin. C'est pourquoi j'ai choisi d'utiliser le chemin comme clé. Ou existe-t-il un autre moyen d'obtenir les valeurs par chemin avec cette structure? –

+0

J'ai mis à jour ma réponse pour montrer comment vous pouvez stocker les données dans un objet, où le chemin est la clé, et contraindre cet objet à un tableau avant le tri. – Eric

0

Du point de vue de la fonction sort, ce que vous essayez de trier est en fait un tableau vide avec un tas de propriétés supplémentaires (/home, /dash). Donc, si vous voulez les trier, vous devez d'abord créer un tableau dans lequel les éléments sont les propriétés de votre tableau original:

var array = []; 
for (var key in nar) { 
    array.push({key:key, value:nar[key]}); 
} 
array.sort(function(a,b){ 
    return b.value.vCount - a.value.vCount; 
} 
+0

Merci Noziar. Cela fonctionne partiellement, malheureusement, il brise le tableau des visiteurs. –