2010-10-31 4 views
1

Disons que j'ai ce tableau des réalisateurs de films:dynamicly ajouter des valeurs à et trier Javascript Object

var directors = ['Woody Allen', 'Woody Allen', 'Clint Eastwood', 'Quentin Tarantino', 'Robert Rodriguez', 'Woody Allen', 'Steven Soderberg', 'Robert Rodriguez, Quentin Tarantino' ]; 

A print_r PHP du aray ressemblerait à ceci:

Array 
(
    [0] => Woody Allen 
    [1] => Woody Allen 
    [2] => Clint Eastwood 
    [3] => Quentin Tarantino 
    [4] => Robert Rodriguez 
    [5] => Woody Allen 
    [6] => Steven Soderberg 
    [7] => Robert Rodriguez, Quentin Tarantino 
) 

Ce que je voudrais faire avec est de faire une boucle dans le tableau et créer un nouveau tableau associatif avec le nom en tant que clé et le nombre de fois qu'il apparaît dans le tableau en tant que valeur. De plus trier le tableau après le plus cher de valeur, de sorte que le résultat final serait comme tihs:

Array 
(
    [Woody Allen] => 3 
    [Robert Rodriguez] => 2 
    [Quentin Tarantino] => 2 
    [Steven Soderberg] => 1 
    [Clint Eastwood] => 1 
) 

Je ne suis pas expert en javascript, mais si je le ferais en PHP je ferais comme ceci:

$directors = array(); 
foreach($dirs as $d){ 
    $pos = strpos($d,","); 
    if($pos === false) { 
     if($directors[$d]){ 
      $directors[$d] = $directors[$d]+1; 
     }else{ 
      $directors[$d] = 1; 
     } 
    }else{ 
     $da = explode(",",$d); 
     foreach($da as $d){ 
      $d = trim($d); 
      if($directors[$d]){ 
       $directors[$d] = $directors[$d]+1; 
      }else{ 
       $directors[$d] = 1; 
      } 
     } 
    } 
} 
arsort($directors); 

J'ai beaucoup essayé de faire la même chose en JavaScript, mais comme les tableaux associatifs n'existent pas de la même manière dans JS, j'ai eu quelques problèmes pour le faire fonctionner. Mon meilleur essai était ce code, mais il ne fait pas ce que je veux:

function add2array(a,v){ 
    if(a[v] != null){ 
     a[v] = a[v]+1; 
    }else{ 
     a[v] = 1; 
    } 
} 

$.each(directors, function(k, v){ 
    if(v.indexOf(",") != -1){ 
     dirs = v.split(","); 
     $.each(dirs, function(k, v){ 
      dtrim = $.trim(v); 
      console.log(dtrim); 
      add2array(r,dtrim); 
     }); 

    }else{ 
     add2array(r,v); 
    } 

}); 

Cela fait une grande JS-objet avec directorname comme clé et compter comme valeur, mais leur toute façon pour moi de trier que ? ou dois-je faire un tableau d'objets pour le faire. Serait vraiment utile si quelqu'un pouvait m'aider à résoudre ce problème. J'utilise jQuery comme vous pouvez le faire pour que votre solution puisse l'utiliser.

+0

Il est toujours préférable de faire le tri au backend, puis-je savoir pourquoi vous voulez faire dans le frontside. Si vous voulez faire du côté de l'interface utilisateur, vous devez utiliser des interfaces UI riches comme dojo grid ou jgrid etc. – kobe

+0

c'est une webapp, fonctionnant sur un iphone, donc il n'y a pas de backend, tout est JS/HTML5/CSS3. – Volmar

Répondre

0

Je l'ai résolu moi-même:

var r = {}, re = []; 

function add2array(a,v){ 
    if(a[v] != null){ 
     a[v] = a[v]+1; 
    }else{ 
     a[v] = 1; 
    } 
} 

$.each(directors, function(k, v){ 
    if(v.indexOf(",") != -1){ 
     dirs = v.split(","); 
     $.each(dirs, function(k, v){ 
      dtrim = $.trim(v); 
      add2array(r,dtrim); 
     }); 

    }else{ 
     add2array(r,v); 
    } 

}); 

for (var i in r) { 
    re.push({ name : i, count : r[i] }); 
} 


function compare(a,b) { 
    if (a.count > b.count) 
    return -1; 
    if (a.count < b.count) 
    return 1; 
    return 0; 
} 

re.sort(compare); 

il fonctionne très bien sur une page autonome, mais il doit y avoir un conflit avec mes autres scripts parce que je ne peux pas l'utiliser où je en ai besoin ...

2

Les tableaux associatifs n'ont aucun ordre, donc vous ne pouvez pas les trier. vous devrez créer un tableau contenant des paires clé: valeur, puis trier sur la propriété de l'élément.

Questions connexes