2013-10-28 113 views
4

我有對象的數組如下所示(雖然下面的例子中具有在陣列中只有一個元素)壓扁嵌套數組/在underscore.js對象

[ 
    { 
     "uptime":0, 
     "load":{"x":0.11,"y":0.22,"z":0.33}, 
     "cpu":[ 
      {"u":111,"n":112,"s":113,"i":114,"q":115}, 
      {"u":211,"n":212,"s":213,"i":214,"q":215} 
     ] 
    } 
] 

進出口試圖使用被拉平每個元素下劃線.js文件,所以整個陣列看起來像這樣:

[ 
    { 
     "uptime":0, 

     "load_x": 0.11 
     "load_y": 0.03 
     "load_z": 0.01, 

     "cpu1_u": 111, 
     "cpu1_n": 112, 
     "cpu1_s": 113, 
     "cpu1_i": 114, 
     "cpu1_q": 115, 

     "cpu2_u": 211, 
     "cpu2_n": 212, 
     "cpu2_s": 213, 
     "cpu2_i": 214, 
     "cpu2_q": 215, 
    } 
] 

我有排序(儘管不是一般)的「負荷」元素,因爲那只是一個已知的3場對象。

展平cpu數組暗示我。 我的代碼如下,與輸出我的代碼生成

我知道我可以只寫一個js循環,並用它做一起,但我見過一些非常優雅的下劃線解決這個樣子,和我敢肯定,它有可能。 有什麼建議嗎?

我的代碼

var profiles = [ 
    { 
     "uptime":0, 
     "load":{"x":0.11,"y":0.22,"z":0.33}, 
     "cpu":[ 
      {"u":111,"n":112,"s":113,"i":114,"q":115}, 
      {"u":211,"n":212,"s":213,"i":214,"q":215} 
     ] 
    } 
]; 

var flat = _.map(profiles, function(profile) { 
     var p = _.extend(_.omit(profile, 'load'), { 
      load_1: Math.round(100*profile.load.x)/100, 
      load_5: Math.round(100*profile.load.y)/100, 
      load_15: Math.round(100*profile.load.z)/100 
     }); 

     var cpuid = 0; 
     var cpuobject = 
      _.map(p.cpu, function(cpu) { 
       cpuid++; 
       return _.object(
        _.map(cpu, function(val, key) { 
         var arr = ['cpu'+cpuid+'_'+key, val]; 
         return arr; 
        }) 
       ); 
      }); 
     return _.extend(_.omit(p, 'cpu'), cpuobject); 
    }); 

console.log(JSON.stringify(flat)); 

我的(錯)輸出

[ 
    { 
     0: { 
      cpu1_u: 233264700, 
      cpu1_n: 0, 
      cpu1_s: 64485200, 
      cpu1_i: 1228073616, 
      cpu1_q: 86100 
     }, 
     1: { 
      cpu2_u: 233264700, 
      cpu2_n: 0, 
      cpu2_s: 64485200, 
      cpu2_i: 1228073616, 
      cpu2_q: 86100 
     }, 
     uptime: 0, 
     load_1: 0.11, 
     load_5: 0.03, 
     load_15: 0.01 
    } 
] 

回答

9

例如:

flatten = function(x, result, prefix) { 
    if(_.isObject(x)) { 
     _.each(x, function(v, k) { 
      flatten(v, result, prefix ? prefix + '_' + k : k) 
     }) 
    } else { 
     result[prefix] = x 
    } 
    return result 
} 


a = 
{ 
    "uptime":0, 
    "load":{"x":0.11,"y":0.22,"z":0.33}, 
    "cpu":[ 
     {"u":111,"n":112,"s":113,"i":114,"q":115}, 
     {"u":211,"n":212,"s":213,"i":214,"q":215} 
    ] 
} 


result = flatten(a, {}) 

{ 
     "uptime": 0, 
     "load_x": 0.11, 
     "load_y": 0.22, 
     "load_z": 0.33, 
     "cpu_0_u": 111, 
     "cpu_0_n": 112, 
     "cpu_0_s": 113, 
     "cpu_0_i": 114, 
     "cpu_0_q": 115, 
     "cpu_1_u": 211, 
     "cpu_1_n": 212, 
     "cpu_1_s": 213, 
     "cpu_1_i": 214, 
     "cpu_1_q": 215 
}  
+0

美麗,謝謝!我不能告訴你,我今晚有多少時間在這裏度過了一夜鬧事 – carpii

+0

Cool.you救了我。謝謝。 –