2016-12-14 3 views
1

は私が私の出力には、このチェックキーの値が存在し、

Array1 = [ 
     0:[{name:A,count:2,hours:3},{name:B,count:3,hours:3},{name:C,count:2,hours:4}] 
     1:[{name:A,count:3,hours:4},{name:B,count:3,hours:3},{name:C,count:2,hours:2}] 
     2:[{name:A,count:3,hours:1},{name:B,count:3,hours:4},{name:C,count:2,hours:5},{name:D,count:2,hours:3}] 
    ]; 

Array2 = ['A','B','C','D']; 

のように私のWebサービスからの応答配列があるとJavaScriptで値を持つキーを押さない場合は、私が必要な場合は、 24時間確認することができます。しかし、わかりやすくするために、今は5時間かかります.Array1の各サブアレイは1人のユーザーに属しています。今、私は時間と活動で配列をグループ化する必要があります。私はキーを各時間の名前の合計数として名前と価値として作る必要があることを意味します。

、出力は

私はグループに値としてキーと合計カウントなど時間と名前を持つ私の配列をしてみてください
angular.forEach(Array1 , function(array){ //angularjs foreach 
    array.forEach(function(a){ 
     obj[a.hours] = obj[a.hours]||[0]; 
     if(obj[a.hours].hasOwnProperty(a.name)){ 
     obj[a.hours][a.name] = parseInt(obj[a.hours][a.name]) + parseInt(a.count); 
     }else{ 
     obj[a.hours][a.name] = parseInt(a.count); 
     } 
     obj[a.hours]['hours'] = a.hours; 
    }); 
    }); 

以下この

var output = [ 
       {hours:1, A:3, B:0, C:0, D:0}, 
       {hours:2, A:0, B:0, C:2, D:0}, 
       {hours:3, A:2, B:6, C:0, D:2}, 
       {hours:4, A:3, B:3, C:2, D:0}, 
       {hours:5, A:0, B:0, C:2, D:0}, 
      ]; 

そして、私の試みのように見える必要があります。より多くの私は何をしようと

var startHour = 1; 
var endHours = 5; 
var newData = []; //@TODO 
newData.push(obj); //@TODO 
for(i= startDate; i < endDate; i++) { 
    var found = newData.some(function(el){ 
     //el.forEach(function(a){ 
     $.each(el, function(key, value) { 
      if(value.hours){ 
      return value.hours === i; 
      } 
     }); 
    }); 
    if(!found){ 
     console.log(i + "not found"); 
     newData.push([{'hours':i}]); 
    } 
    } 
    console.log(newData); 

あるしかし、私はないfound.Asで午前たびに私の出力は、私は、キーと値のペアの名前を押して終了していない場合は0をカウントする必要があります。しかし、まず、私は時間がない場合には、ほんの数時間をかけようとします。誰も私が間違っていたことを私に示唆できますか?私はバックエンドのプログラマーですので、私はJavaScriptの知識がありません。

ありがとうございます。

+0

ARRAY1はオブジェクトではなく、私は私のミスについて謝罪配列 – yBrodsky

+0

です。私は私のコンソールからそれをコピーしようとします。 – Dev

+0

戻り値はjqueryルーチンに戻ります...そして、すべての要素をループする関数のすべての要素をループしています(いくつか)does notはそれほど意味をなさないでしょう –

答えて

1

適切な時間オブジェクトの参照にハッシュテーブルを使用し、Array#forEachでデータを反復することができます。後で、必要な順序の結果配列をソートします。

var array1 = [[{ name: 'A', count: 2, hours: 3 }, { name: 'B', count: 3, hours: 3 }, { name: 'C', count: 2, hours: 4 }], [{ name: 'A', count: 3, hours: 4 }, { name: 'B', count: 3, hours: 3 }, { name: 'C', count: 2, hours: 2 }], [{ name: 'A', count: 3, hours: 1 }, { name: 'B', count: 3, hours: 4 }, { name: 'C', count: 2, hours: 5 }, { name: 'D', count: 2, hours: 3 }]], 
 
    array2 = ['A', 'B', 'C', 'D'], 
 
    grouped = []; 
 

 
array1.forEach(function (a) { 
 
    a.forEach(function (b) { 
 
     if (!this[b.hours]) { 
 
      this[b.hours] = { hours: b.hours }; 
 
      array2.forEach(function (c) { this[c] = 0; }, this[b.hours]); 
 
      grouped.push(this[b.hours]); 
 
     } 
 
     this[b.hours][b.name] += b.count; 
 
    }, this); 
 
}, Object.create(null)); 
 

 
grouped.sort(function (a, b) { return a.hours - b.hours; }); 
 

 
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

ゼロベースhourと24時間のアレイと提案、。

var array1 = [[{ name: 'A', count: 2, hours: 3 }, { name: 'B', count: 3, hours: 3 }, { name: 'C', count: 2, hours: 4 }], [{ name: 'A', count: 3, hours: 4 }, { name: 'B', count: 3, hours: 3 }, { name: 'C', count: 2, hours: 2 }], [{ name: 'A', count: 3, hours: 1 }, { name: 'B', count: 3, hours: 4 }, { name: 'C', count: 2, hours: 5 }, { name: 'D', count: 2, hours: 3 }]], 
 
    array2 = ['A', 'B', 'C', 'D'], 
 
    grouped = Array.apply(null, { length: 24 }).map(function (_, i) { 
 
     var o = { hours: i } 
 
     array2.forEach(function (a) { this[a] = 0; }, o); 
 
     return o; 
 
    }); 
 

 
array1.forEach(function (a) { 
 
    a.forEach(function (b) { 
 
     grouped[b.hours][b.name] += b.count; 
 
    }, this); 
 
}, Object.create(null)); 
 

 
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

レスポンスの@Scholzありがとうございました。私の出力は問題の言及として得られますが、私の問題は24時間をループする必要があります。 – Dev

+0

それはいつも24時間ですか?それはゼロから始まっていますか? –

+0

ya、私は24時間しなければならないし、何時間も私のArray1に入ることはできません。 – Dev

0

あなたはオブジェクト(毎時1つのオブジェクト)の配列に開始することができます。そして、この配列内の時間と名前をcoresponding新しい追加の回数をプッシュ:

var Array1 = [[{name: "A",count: 2,hours: 3},{name: "B",count: 3,hours: 3},{name: "C",count: 2,hours: 4}],[{name: "A",count: 3,hours: 4},{name: "B",count: 3,hours: 3},{name: "C",count: 2,hours: 2}],[{name: "A",count: 3,hours: 1},{name: "B",count: 3,hours: 4},{name: "C",count: 2,hours: 5},{name: "D",count: 2,hours: 3}]]; 
 
var Array2 = ['A','B','C','D']; 
 
var res = [1,2,3,4,5].map(x => ({"hours": x})).map(x => { 
 
    Array2.forEach(y => x[y] = 0); 
 
    return x; 
 
}); 
 
Array1.reduce((a,b) => a.concat(b)).forEach(x => { 
 
    if (Array2.indexOf(x.name) !== -1) 
 
    res[x.hours - 1][x.name] += x.count; 
 
}) 
 
console.log(res);

関連する問題