2016-06-21 19 views
1

何らかの理由で、私はJavascript配列で必要な結果を得るのに迷っています。ユニークと合計で既存の配列値から新しい配列を作成する

私は、1行に1日と複数のタイムスタンプを含むデータ行を持っています。私がする必要があるのは、そのデータをchart.jsの配列に変換することですが、行を週ごとにマージし、時間を(タイムスタンプから)合計します。以下は、クエリの結果から新しい配列を作成するところですが、必要なときにそれを取得するのに苦労しています。私は(処理付き)配列を作成するのはここ

です:

function chartData(queryrowlist){ 
    var weeks = []; 
    angular.forEach(queryrowlist, function(value, key) 
    { 
    weeks.push(moment(value.date).format('w'),getOnHours(value),getOffHours(value)) 
    }); 
    // create chart array ... 
    return chart; 
} 

週間の配列は次のように終わる:週番号、OnHours、OffHours

ある

["23",28800000,3600000,"23",30300000,2700000,"24",35400000,3300000,"24",30000000,3300000] 

週番号はラベルとして使用され、時間は角度チャート/ chart.jsのオン/オフデータとして使用されます。問題は、すべての週番号がユニークでなければならず、すべての時間が毎週集計されていることです。

だから、私は出力にこのような配列が必要になります。

chart['weeks']=["23","24"] 
chart['hours']=[[59100000,6300000],[65400000,6300000]] 

これはおそらく、シンプルであり、それはちょうど私が思考ハンガーノックだ...しかし、誰もが解決策を持っている場合、私はなるだろう感謝します。

ありがとうございます。

アップデート:このを参照してください可能性がある人のため

、結果の配列はchart.jsのため正しくありません。以下の回答は正しいです...尋ねられたように、私はちょうど間違ったことを尋ね、後にしか実現しませんでした。馬鹿のように感じ:/

Chart.jsがしたいことはある同じ配列で、その代わりに、上記の例のすべての行の値です:

chart['weeks']=["23","24"] 
chart['hours']=[[onhours,offhours],[onhours,offhours]] 

それは次のようになります。

chart['weeks']=["23","24"] 
chart['hours']=[[onhours,onhours],[offhours,offhours]] 

更新2

さらに明確にする:

各ラベルには値が必要です。ラベルが3つある場合は、3つの値が必要です。私の場合、値の配列は2セットあります。これは、2シリーズ(2行)、1時間、1時間、1時間です。ここでは配列の完全なリストを示します。

chart['labels']=["23","24","25","26"] // strings 
chart['data']=[[onhours,onhours,onhours,onhours]] // integers, notice [ [ ] ] 
chart['series']=['On Hours'] // strings 

希望に役立ちます:私は唯一の1行を必要に応じて

chart['labels']=["23","24","25"] // strings 
chart['data']=[[onhours,onhours,onhours],[offhours,offhours,offhours]] // integers 
chart['series']=['On Hours','Off Hours'] // strings 

+0

あなたは一例に拡張してもらえますか?例えばあなたが 'chart ['hours'] = [[onhours、onhours、onhours]、[offhours]を持っていれば、あなたは' chart ['weeks'] = ["23"、 "24"、 "25" 、offhours、offhours]] '? –

+0

@HopefulLlama - はい、正しいです。私は例を更新しました。今はっきりしていることを願っています。 – Chris

+0

あなたが必要かどうかわかりませんが、私は自分の答えを更新しました。 –

答えて

2

あなたが望むように2つの配列に分割してみませんか?

function chartData(queryrowlist){ 
    // Set up our data store + return object 
    var chart = { 
     weeks: [], 
     hours: [] 
    }; 
    // For every value in the parameter given 
    angular.forEach(queryrowlist, function(value, key) { 
     // Get the week, and check if it is in the array 
     var week = moment(value.date).format('w'); 
     var weekIndex = chart.weeks.indexOf(week); 

     // If the index is -1, it is not in the array, so just push values; 
     if(weekIndex === -1) { 
      chart.weeks.push(week); 
      chart.hours.push([getOnHours(value),getOffHours(value)]); 
     } else { 

      // If the index is not, we assume that the weekIndex is the correct index to sum the values on. 
      chart.hours[weekIndex] = [chart.hours[weekIndex][0] + getOnHours(value), chart.hours[weekIndex][1] + getOffHours(value)]; 
     } 

    }); 
    return chart; 
} 

EDIT:質問に編集を反映する新たな答え。

アルゴリズムはほぼ同じですが、出力配列はわずかに変化します。

function chartData(queryrowlist){ 
    // Set up our data store + return object 
    var chart = { 
     weeks: [], 
     // Notice, two arrays in array 
     hours: [ 
      [], 
      [] 
     ] 
    }; 
    // For every value in the parameter given 
    angular.forEach(queryrowlist, function(value, key) { 
     // Get the week, and check if it is in the array 
     var week = moment(value.date).format('w'); 
     var weekIndex = chart.weeks.indexOf(week); 

     // If the index is -1, it is not in the array, so just push values; 
     if(weekIndex === -1) { 
      chart.weeks.push(week); 
      chart.hours[0].push(getOnHours(value)); 
      chart.hours[1].push(getOffHours(value)); 
     } else { 

      // If the index is not, we assume that the weekIndex is the correct index to sum the values on. 
      // Also notice the change to output to different arrays 
      chart.hours[0][weekIndex] += getOnHours(value); 
      chart.hours[1][weekIndex] += getOffHours(value); 
     } 

    }); 
    return chart; 
} 
+0

同じ週番号が2回以上出現した場合に加算を行いたい。 – 4castle

+0

@ 4castleありがとう、私はなぜそれに気付かなかったのかわかりません。うまくいけば私の答えを編集しました。 –

+0

'else'ブロックを' chart.hours [weekIndex] [0] + = getOnHours(value);}で合理化することができます。 chart.hours [weekIndex] [1] + = getOffHours(value); '。 'hours.push'は配列をプッシュしなければならないことを覚えておいてください。' hours.push([getOnHours(value)、getOffHours(value)]); ' – 4castle

0

chart.jsの配列を維持する必要がない場合は、代わりにオブジェクトを使用します。

function chartData(queryrowlist){ 
    var weeks = {}; 
    angular.forEach(queryrowlist, function(value, key) 
    { 
    var week = moment(value.date).format('w'); 
    if(!weeks[week]){ //new week 
     weeks[week] = { 
     onHours: getOnHours(value), 
     offHours: getOffHours(value) 
     } 
    } else { //week exists 
     weeks[week].onHours += getOnHours(value); 
     weeks[week].offHours += getOffHours(value);  
    } 
    }); 
    // create chart array ... 
    return chart; 
} 

結果: weeks = { 23: { onHours: 59100000 , offHours: 6300000 }, 24: { onHours: 65400000, offHours: 6600000 }}

そして、あなたはweeks.week#.onHoursweeks[week#]['onHours']でそれにアクセスします。

これは、同期して保持する必要のある2つの別々のアレイよりも、読みやすく、追跡しやすく、管理しやすくなります。

+0

これをchart.js APIにエクスポートしているため、出力形式を変更できません。私のコメントは誤解を招いていたので、削除しました。 – 4castle

+0

ご協力いただきありがとうございます。 – Chris

1

オブジェクトを使用してグループ化し、後でキーをソートし、その合計でチャートオブジェクトを構築することができます。

var array = ["23", 28800000, 3600000, "23", 30300000, 2700000, "24", 35400000, 3300000, "24", 30000000, 3300000], 
 
    chart = {}, 
 
    data = Object.create(null); 
 

 
array.reduce(function (r, a, i) { 
 
    if (i % 3 === 0) { 
 
     if (!data[a]) { 
 
      data[a] = { week: a, hours: [0, 0] }; 
 
     } 
 
     return a; 
 
    } 
 
    data[r].hours[i % 3 - 1] += a; 
 
    return r; 
 
}, undefined); 
 

 
Object.keys(data).sort(function (a, b) { 
 
    return a - b; 
 
}).forEach(function (k) { 
 
    chart.weeks = chart.weeks || []; 
 
    chart.hours = chart.hours || []; 
 
    chart.weeks.push(data[k].week) 
 
    chart.hours.push(data[k].hours); 
 
}); 
 

 
console.log(chart);

+0

最終的に値を合計するために還元操作を行っているので、ここでは「還元」がより意味をなさないかもしれません。それは読みやすくすることができます。 – 4castle

+0

はここでは動作しません。 –

+1

削減オブジェクトに 'last'フィールドを与えることができませんでしたか? – 4castle

関連する問題