【问题标题】:Dynamicly add values to and sort Javascript Object动态地将值添加到 Javascript 对象并对其进行排序
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我自己解决了:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 2014-05-20
      • 2021-08-19
      • 2022-06-29
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      相关资源
      最近更新 更多