【发布时间】:2010-10-31 17:36:27
【问题描述】:
假设我有这样一群电影导演:
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-Object 以 directorname 作为 key 并 count 作为 value,但是他们有什么办法让我对它进行排序吗?还是我需要制作一组对象来做到这一点。如果有人可以帮助我解决这个问题,那将非常有帮助。我正在使用 jQuery,你可以使用它,所以你的解决方案可以使用它。
【问题讨论】:
-
在后端进行排序总是更好,我可以知道您为什么要在前端进行排序。如果你想在 UI 方面做,你应该使用一些丰富的 UI 接口,如 dojo grid 或 jgrid 等。
-
这是一个webapp,运行在iphone上,所以没有后端,都是JS/HTML5/CSS3。
标签: php javascript jquery javascript-objects