0

サーバーからデータテーブルに送られるデータがあります。テーブルにデータを正常に入力していますが、フッター コールバックで統計を行いたいと考えています。

次のようなデータがあるとしましょう。

var data = [{
    date: '2013-05-12',
    holiday: "One type of holiday",
    dayType: "Weekend"
}, {
    date: '2013-05-13',
    holiday: "Another type",
    dayType: "Weekend"
}, {
    date: '2013-05-14',
    holiday: "Another type",
    dayType: "Work"
}, {
    date: '2013-05-15',
    holiday: "",
    dayType: "Work"
}];

休日が異なる日数を数えたいと思います。

取得したい結果は次のとおりです。

var summary= [
{
    "One type of holiday": {
        "work": 0,
        "weekend": 1
    }
},
{
    "Another type": {
        "work": 1,
        "weekend": 1
    }
}];

単純に休日を集計するための非常に単純なコードを作成しました

for (var i = 0; i < data.length; i++) {
    //console.log(data[i].holiday);
    /*other stuff here*/
    if (data[i].holiday.length > 0) 
        summary[data[i].holiday] = summary[data[i].holiday] + 1 || 1;
}

しかし、データ配列の休日にスペースが含まれているため、これにより無効な結果が得られます。

これを修正し、dayType に基づいて休日を分割する方法が必要です。


私の解決策: 私のバージョンの答え

var summary = {}, d, tmp, type;
for (var i = 0; i < data.length; i++) {
    var d = data[i];
    if (d.holiday.length > 0) {
        type = d.dayType == 'Weekend' || d.dayType == 'Free' ? 'Weekend' : 'Work';
        tmp = summary[d.holiday];
        if (!tmp) {
            tmp = {
                Weekend: 0,
                Work: 0
            };
            summary[d.holiday] = tmp;
        }
        summary[d.holiday][type] += 1;
    }
}

これは@Arun回答の修正版であるため、これをスタンドアロンの回答として投稿していません。
私のバージョンの方が理解しやすいと思います。誰かが役に立つといいのですが。

4

3 に答える 3

2

試す

var summary = [], summaryMap = {}, d, map, m;
for (var i = 0; i < data.length; i++) {
    var d = data[i];
    map = summaryMap[d.holiday];
    if(!map){
        map = {
            Work: 0,
            Weekend: 0
        };
        m = {};
        m[d.holiday] = map;
        summary.push(m);
        summaryMap[d.holiday] = map;
    }
    map[d.dayType] += 1;
}
console.log(summary);
console.log(JSON.stringify(summary));

デモ:フィドル

于 2013-05-24T08:29:33.730 に答える
1

をやる

console.log(Object.keys(summary).length);

それ以外の

console.log(summary.length);

length 属性を使用して、js オブジェクト内の要素の数を取得できるためです。

注: Object.keys を使用すると、ブラウザーの互換性の問題が発生する可能性があります。IE 9 および Firefox 4 でサポートされています。 詳細については、このMDN 記事を参照してください。

この回答で、この問題の詳細と解決策を見つけることができます。

更新された fiddleを参照してください。

于 2013-05-24T08:29:37.517 に答える
0

これが私の試みです:

var summary = [];
var holidayTypes = [];
var dayTypes = [];

//first work out the different types of holidays
for (var i = 0; i < data.length; i++) {
   if(holidayTypes.indexOf(data[i].holiday) == -1){
       //this is a new type of holiday
       holidayTypes.push(data[i].holiday);
   }
   if(dayTypes.indexOf(data[i].dayType) == -1){
       //new type of day. 
       dayTypes.push(data[i].dayType);
   }
}
console.log('types of holiday: ' + JSON.stringify(holidayTypes));
console.log('types of day: ' + JSON.stringify(dayTypes));


for(index in holidayTypes){
    var typeobj = {};
    //create an object for each type of holiday
    typeobj[holidayTypes[index]] = {};

    for(index2 in dayTypes){
        //initialize a count for each type of day
        typeobj[holidayTypes[index]][dayTypes[index2]] = 0;
        //iterate through the data and count the occurrences where the day AND holiday match.
        //if they do, iterate the value.
        for (var j = 0; j < data.length; j++){
            if((data[j].holiday == holidayTypes[index]) 
                && (data[j].dayType == dayTypes[index2])){
                typeobj[holidayTypes[index]][dayTypes[index2]]++;                        
            }
        }
    }
    summary.push(typeobj);
}
console.log(JSON.stringify(summary));

ここでフィドル

出力: [{"One type of holiday":{"Weekend":1,"Work":0}},{"Another type":{"Weekend":1,"Work":1}},{"":{"Weekend":0,"Work":1}}]

それは機能しますが、上記の人たちほど効率的である可能性は低いです!

于 2013-05-24T08:56:26.680 に答える