2010-10-31 94 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對的數組,然後對該項的屬性進行排序。