Question

Disons que j'ai ce tableau des réalisateurs de films:

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

PHP print_r 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 elle est en boucle à travers le réseau et créer un nouveau tableau associatif avec le nom comme clé et le nombre de fois qu'il apparaît dans le tableau en tant que valeur. De plus trier le tableau après la valeur le plus élevé, 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 un 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);

beaucoup Essayé de façons de faire la même chose en JavaScript, mais puisque les tableaux associatifs n'existent pas de la même façon JS j'ai eu des problèmes de som 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);
    }

});

fait un grand JS-objet avec directorname comme clé et compte en tant que valeur, mais leur toute façon pour moi de trier cela? ou dois-je besoin de faire un tableau d'objets pour le faire. Ce serait vraiment serviable si quelqu'un pouvait me aider à résoudre ce problème. J'utilise jQuery comme vous pouvez donc votre solution se peut l'utiliser pour.

Était-ce utile?

La solution 2

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 ...

Autres conseils

tableaux associatifs ont pas d'ordre, vous ne pouvez pas les trier. vous devrez faire un tableau contenant la clé:. paires de valeurs et tri sur la propriété de l'élément

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top