2016-04-20 19 views
1

私は単純なことをしようとしていますが、動作しません。多次元配列の結合、javascript

私はこのような構造を持つ2つの配列を持っています。私はそれが「合計」列に値だが、それだけで出力は次のようになりますので、噛まないであろうと「失敗」キーを追加しようとしている

total -> 
[0]-> [Day: 2016-04-19, Total: 23] 
[1]-> [Day: 2016-04-18, Total: 20] 
failed -> 
[0]-> [Day: 2016-04-19, Failed: 2] 
[1]-> [Day: 2016-04-18, Failed: 0] 

arr -> 
[0]-> [Day: 2016-04-19, Total: 23, Failed: 2] 
[1]-> [Day: 2016-04-18, Total: 23, Failed: 0] 
... 

"合計" 私はのvar SQL1に割り当てられたとしている私はのvar SQL2に割り当てられている "失敗した" と、私はさまざまな機能を試してみましたが、のようなforループました:

for (var i = 0; i < sql1.length; i++) { 
    sql1[i][2] = sql2[i][1]; 
} 

しかし、sql1は同じままです。私は間違って何をしていますか?

私も

sql1[i].push(sql2[i][1]); 

を試みたしかし、それはどちらか動作しませんでした。

答えて

1

いくつかのループと正しいキーのためのハッシュテーブルを使用する。

var data = { total: [{ Day: '2016-04-19', Total: 23 }, { Day: '2016-04-18', Total: 20 }], failed: [{ Day: '2016-04-19', Failed: 2 }, { Day: '2016-04-18', Failed: 0 }] }, 
 
    grouped = []; 
 

 
Object.keys(data).forEach(function (k) { 
 
    data[k].forEach(function (a) { 
 
     var key = { total: 'Total', failed: 'Failed' }[k]; 
 
     if (!this[a.Day]) { 
 
      this[a.Day] = { Day: a.Day, Total: 0, Failed: 0 }; 
 
      grouped.push(this[a.Day]); 
 
     } 
 
     this[a.Day][key] += a[key]; 
 
    }, this); 
 
}, Object.create(null)); 
 

 
document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');

+1

ありがとう!いくつかのマイナーな書き直しで完璧に作業し、{Day:a.Day、Total:0、Failed:0}を置き換えなければならなかった。 {日:a.Day、合計: ''、失敗: '}};プレフィックスとして表示される0を削除します。ありがとう! – HenrikM

1

あなたは、このようにCONCATENATE複数の配列のためArray.prototype.concat()を使用することができます。

var alpha = ['a', 'b', 'c'], 
numeric = [1, 2, 3]; 

var alphaNumeric = alpha.concat(numeric); 

console.log(alphaNumeric); // Result: ['a', 'b', 'c', 1, 2, 3] 

をしかし、あなたのコードを見て、あなたがオブジェクトで配列をめちゃくちゃにしているようです。

var total = [{ 
    Day: "2016-04-19", 
    Total: 23 
}, 
{ 
    Day: "2016-04-18", 
    Total: 20 
}]; 

var failed = [{ 
    Day: "2016-04-19", 
    Total: 2 
}, 
{ 
    Day: "2016-04-18", 
    Total: 0 
}]; 

console.log(total.concat(failed)); 
1

このお試しください:日数は、アレイ内の同じ位置に常にある場合は、使用してコードを簡素化することができ

var total = [ 
 
    {Day: '2016-04-19', Total: 23}, 
 
    {Day: '2016-04-18', Total: 20} 
 
    ], 
 
    failed = [ 
 
    {Day: '2016-04-19', Failed: 2}, 
 
    {Day: '2016-04-18', Failed: 0} 
 
    ]; 
 
// clone total array 
 
var arr = total.slice().map(function(obj) { 
 
    var result = {}; 
 
    result.Day = obj.Day; 
 
    result.Total = obj.Total; 
 
    return result; 
 
}); 
 
for (var i=0; i<failed.length; ++i) { 
 
    for (var j=0; j<arr.length; ++j) { 
 
    if (failed[i].Day == arr[j].Day) { 
 
     arr[j].Failed = failed[i].Failed; 
 
    } 
 
    } 
 
} 
 
document.body.innerHTML = '<pre>' + JSON.stringify(arr, true, 4) + '</pre>';

を:

あなたのコードはより次のようになります。
for (var i=0; i<failed.length; ++i) { 
    arr[i].Failed = failed[i].Failed; 
}