2009-08-12 51 views
1

我正在嘗試創建一個帶有一些分組標題的表。 一切都很好,當我有1組,但我如何創建動態組?Javascript動態分組

這是我迄今(1組):

var groupby = ''; 
arrdata.each(function(element){ 
    if (groupby != element.groupby) { 
     groupby = element.groupby; 
     tbody.push(groupby) 
    } 
    tbody.push(element) 
}) 

我如何讓它創建動態組?

+0

如何arrdata的結構? – 2009-08-12 16:28:41

回答

0

嘗試用這種結構:

arrdata = [ 
    { 
     "groupby": {fields}, 
     "data":[{fields},{fields},{fields}] 
    }, 
    { 
     "groupby": {fields}, 
     "data":[{fields},{fields},{fields}] 
    }, 
    { 
     "groupby": {fields}, 
     "data":[{fields},{fields},{fields}] 
    }, 
] 

jQuery.each(arrdata, function(element){ 
    tbody.push(element.groupby) 
    jQuery.each(element.data , function(elementData){ 
     tbody.push(elementData); 
    }) 
}) 
+0

沒錯,但那是考慮到我有這樣的數據分組,但如果我只是有一堆數據,並在另一堆groupby的? – R0b0tn1k 2009-08-17 13:20:41

+0

然後您將不得不通過一個示例,因此提供解決方案會更容易 – 2009-08-17 20:44:06

2

,你可以將它們組合成一個Object第一:

Array.prototype.groupBy = function(keyName) { 
    var res = {}; 
    this.forEach(function(x) { 
    var k = x[keyName]; 
    var v = res[k]; 
    if (!v) v = res[k] = []; 
    v.push(x); 
    }); 
    return res; 
}; 

那麼對於..通過對象:

var employees = [{first: ..., last: ..., job: ...}, ...]; 
var byJob = employees.groupBy('job'); 
for (var job in byJob) { 
    document.write('<h3>Job: '+job+'</h3>'); 
    byJob[job].forEach(function(e) { 
    document.write('<p>'+e.last+', '+e.first+'</p>'); 
    }); 
} 
0

更通用解。你可以直接使用它。使用對象的深層副本。 請注意,這個解決方案是多項式時間

Array.prototype.groupBy=function(property){ 
"use strict";function deepCopy(p) { 
var c = {}; 
for (var i in p) { 
     if (typeof p[i] === 'object') { 
     c[i] = (p[i].constructor === Array)?[]:{}; 
     deepCopy(p[i],c[i]); 
     } 
else { 
     c[i] = p[i]; 
     } 
} 
return c; 
} 
var retarr=[]; 
var len=this.length; 
for(var i=0;i<len;i++){ 
    var groupedlen=retarr.length,found=false; 
    for(var j=0;j<groupedlen;j++){ 
     if(this[i][property]===retarr[j].key){ 
      retarr[j].values.push(deepCopy(this[i])); 
      found=true; 
      break; 
     } 
    } 
    if (found === false) { 
     retarr.push({ 
      key: this[i][property], 
      values: [] 
     }); 
     retarr[retarr.length-1].values.push(deepCopy(this[i])); 
    } 
} 
return retarr;  
}; 

測試用例:

var arr=[{num: 1,key:911},{num: 2,key:22},{num: 3,key:23},{num: 4,key:222},{num: 4,key:2222},{num: 2,key:2},{num: 1,key:29},{num: 3,key:26},{num: 4,key:24}]; 

var grouped=arr.groupBy('num'); 

console.log(grouped);