Динамически добавлять значения и сортировать Javascript Object - PullRequest
1 голос
/ 31 октября 2010

Допустим, у меня есть этот массив режиссеров:

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, я бы сделал так:

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

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

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-объект с директором в качестве ключа и считается как значение, но это их любой способ для менясортировать что?или мне нужно сделать массив объектов, чтобы сделать это.Было бы очень полезно, если бы кто-нибудь мог помочь мне решить это.Я использую jQuery как вы можете, чтобы ваше решение могло использовать это для.

Ответы [ 2 ]

2 голосов
/ 31 октября 2010

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

0 голосов
/ 04 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...