1

いくつかのグループ化ヘッダーを使用してテーブルを作成しようとしています。グループが1つある場合はすべて問題ありませんが、動的グループを作成するにはどうすればよいですか?

これは私がこれまでに持っているものです(1グループの場合):

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

動的グループを作成するにはどうすればよいですか?

4

3 に答える 3

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>');
  });
}
于 2010-02-22T02:08:33.293 に答える
1

より一般的なソリューション。直接使用できます。使用されるオブジェクトのディープ コピー。この解は多項式時間であることに注意してください

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);
于 2011-11-05T07:30:24.493 に答える
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);
   }) 
})
于 2009-08-12T16:39:09.660 に答える