动态地向Javascript对象添加值并对其进行排序

时间:2010-10-31 17:36:28

标签: php javascript jquery javascript-objects

假设我有一系列电影导演:

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

aray的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中不存在相同的方式,因此我有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-Object以directorname作为键并计为值,但是他们可以通过什么方式对它进行排序?或者我需要制作一个对象数组来做到这一点。如果有人能帮助我解决这个问题,那将会非常有帮助。我正在使用jQuery,因此您的解决方案可以使用它。

2 个答案:

答案 0 :(得分:2)

关联数组没有顺序,因此您无法对它们进行排序。你必须创建一个包含key:value对的数组,然后对该项的属性进行排序。

答案 1 :(得分: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);

它在独立页面上运行良好,但必须与我的其他脚本发生冲突,因为我无法在需要的地方使用它...