2010-10-31 91 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做,我会做这样的:

$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-对象与directorname关键和算作价值,但他们是任何方式对我来说,那种?或者我需要制作一组对象来做到这一点。如果有人能帮我解决这个问题,那真的很有帮助。我正在使用jQuery,因此您的解决方案可以使用它。

+0

它总是在后端进行排序更好,我可以知道你为什么想在前端进行排序。如果你想在UI方面做,你应该使用一些丰富的UI接口,如dojo网格或jgrid等 – kobe 2010-10-31 17:48:39

+0

这是一个web应用程序,运行在iphone上,所以没有后端,它是所有的JS/HTML5/CSS3。 – Volmar 2010-10-31 18:06:46

回答

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

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