2010-10-31 2 views
1

Допустим, у меня есть этот массив кинорежиссеров:динамически добавлять значения и сортировки объектов JavaScript

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

PHP-print_r в Арай будет выглядеть следующим образом:

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 
) 

Что я хотел бы для этого нужно перебирать массив и создавать новый ассоциативный массив с именем в качестве ключа и количеством раз, которое оно появляется в массиве как значение. Кроме сортировки массива после значения высокий первый, так что конечный результат будет, как tihs:

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

Я не эксперт по JavaScript, но если я хотел бы сделать это в PHP я хотел бы сделать так:

Пробовал много способов сделать то же самое в JavaScript, но так как ассоциативные массивы не существуют одинаково в JS, у меня были проблемы som, чтобы заставить его работать. Моя лучшая попытка была этот код, но он не делает то, что я хочу:

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

}); 

Это делает один большой JS-объект с directorname как ключ и считается значение, но их какой-либо способ для меня, чтобы разобраться, что ? или мне нужно сделать массив объектов для этого. Было бы очень полезно, если бы кто-нибудь мог помочь мне решить эту проблему. Я использую jQuery, как вы можете, так что ваше решение может использовать это.

+0

Всегда лучше делать сортировку на бэкэнде, могу я знать, почему вы хотите сделать это на фронте. Если вы хотите сделать это на стороне пользовательского интерфейса, вы должны использовать некоторые богатые интерфейсы пользовательского интерфейса, такие как сетка dojo или jgrid и т. Д. – kobe

+0

это webapp, работающий на iphone, поэтому нет бэкэнд, это все JS/HTML5/CSS3. – Volmar

ответ

0

Я решил это сам:

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

он прекрасно работает на странице автономной, но должен быть какой-то конфликт с другими моими скриптами, потому что я не могу использовать его там, где я нужен ...

2

Ассоциативные массивы не имеют порядка, поэтому вы не можете отсортировать их. вам нужно будет создать массив, содержащий пары ключ: значение, а затем отсортировать по свойству элемента.

Смежные вопросы