Domanda

Diciamo che ho questa serie di registi:

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

Un PHP print_r del aray sarebbe simile a questa:

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
)

Quello che vorrei fare con esso è un ciclo tra la matrice e creare un nuovo array associativo con il nome come chiave e il numero di volte che appare nella matrice come valore di. Inoltre ordinare l'array dopo il valore più alto, in modo che il risultato finale sarebbe come tihs:

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

Non sono un esperto su JavaScript, ma se lo farei in PHP vorrei fare come questo:

$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);

un sacco Provato di modi per fare la stessa cosa in JavaScript, ma dal momento che gli array associativi non esistono nello stesso modo in JS Ho avuto problemi som per farlo funzionare. Il mio miglior prova era questo codice, ma non fare quello che voglio:

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);
    }

});

Questo fa una grande JS-Object con directorName come chiave e contano come valore, ma è il loro alcun modo per me di tipo che? o devo fare un array di oggetti per farlo. Sarebbe veramente utile se qualcuno potesse aiutarmi a risolvere questo. Sto utilizzando jQuery, come si può se così la soluzione possibile utilizzare che per.

È stato utile?

Soluzione 2

ho risolto io stesso:

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);

funziona benissimo su una pagina standalone, ma ci deve essere qualche conflitto con i miei altri script perché non posso usarlo in cui ho bisogno ...

Altri suggerimenti

array associativi hanno alcun ordine, quindi non è possibile ordinarli. si dovrà fare una matrice contenente la chiave:. coppie di valori e quindi ordinare sulla proprietà dell'elemento

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top