2012-10-31 31 views
0

我有這個數組中的javascript:你可以看到它here使用underscorejs過濾2維數組

Array 
(
    [2012-10-01] => Array 
     (
      [1] => 1 
      [2] => 0 

... 
      [148] => 0 
      [149] => 0 
      [150] => 1 
     ) 

[2012-10-02] => Array 
     (
      [1] => 0 
      [2] => 1 

... 
      [148] => 0 
      [149] => 1 
      [150] => 0 
     ) 

[2012-10-03] => Array 
     (
      [1] => 1 
      [2] => 0 

... 
      [148] => 0 
      [149] => 0 
      [150] => 1 
     ) 
.............. 

,以減少它,我想保持唯一項目,其擁有者,並省略與零的項目。 這樣

Array 
(
    [2012-10-01] => Array 
     (
      [23] => 1 
      [64] => 1 
      [70] => 1 
      [73] => 1 
      [76] => 1 
      [108] => 1 
      [138] => 1 
     ) 

我用underscorejs和驗證碼:

var new_o={}; 
    var v = _.each(original_array,function(day,key){ 
     var arr = {}; 
     _.map(day,function(item,k){ 
      if (item){ 
       arr[k]=item; 
      } 
     }) ; 

     new_o[key]= arr; 
    }) ; 

它的工作原理,但我敢肯定,我沒有得到最好的下劃線。 有人可以提出一個更聰明的方法嗎?

+1

這看起來並不像一個JavaScript數組。 – georg

+0

它是,我只是從瀏覽器控制檯 –

+0

打印我想說的是,你可以使用JavaScript語法發佈數組,以使潛在的海報更容易測試你的代碼。 – georg

回答

2

如果不使用_.map,則不要使用它的返回值,這只是_.each稍微昂貴的一個版本。

至於簡化的東西的話,你是一個有點卡住,因爲這兩個下劃線和JavaScript真的要遍歷數組和你嵌套對象(順便說一句,{ }是在JavaScript中對象文本[ ]數組,它們完全不同)。使用當前的數據結構可能最好的做法是使用_.reduce在攜帶新子對象時迭代子對象;是這樣的:

var new_o = { }; 
_.each(original, function(day, key) { 
    new_o[key] = _(day).reduce(function(memo, item, k) { 
     if(item) 
      memo[k] = item; 
     return memo; 
    }, { }); 
}); 

演示:http://jsfiddle.net/ambiguous/FZRV3/

+0

謝謝。你能告訴我,如果它是陣列,它會怎麼樣? 我的意思是如果結構是數組。 –

+0

這取決於你的數組版本的數據是什麼樣的,但它可能涉及['_.filter'](http://underscorejs.org/#filter)。 –