2016-10-31 12 views
1

sql.jsライブラリを使用してリモートSQLデータベースと通信する以下のJavaScriptコードがあります。JavaScript配列の補完値がありません

var xhr = new XMLHttpRequest(); 
xhr.open('GET', 'https://dl.dropboxusercontent.com/u/540963/test.sqlite', true); 
xhr.responseType = 'arraybuffer'; 
var output = []; 

xhr.onload = function(e) { 
    var uInt8Array = new Uint8Array(this.response); 
    var db = new SQL.Database(uInt8Array); 
    var data = db.exec("SELECT year, weight FROM freq_data WHERE doi = 'D007266'"); 

    $.each(data[0].values, function(key, value) { 
    output.push({'year': value[0], 'weight': value[1]}); 
    }); 
}; 
xhr.send(); 

出力はoutputアレイに格納されます。たとえば、指定された配列のデータは次のとおりです。

{ year=1996, weight=3} 
{ year=1999, weight=2} 
{ year=2004, weight=5} 
{ year=2005, weight=3} 
{ year=2006, weight=2} 

データにはいくつかのギャップがあります。例えば、1997年、1998年、2000年〜2003年の間はエントリーが存在しない。私はで終わるために0の値で欠落年間埋めるためにデータを転嫁する方法を疑問に思う:

{ year=1996, weight=3} 
{ year=1997, weight=0} 
{ year=1998, weight=0} 
{ year=1999, weight=2} 
... 
{ year=2006, weight=2} 

それを行うための最も適切な方法は何ですか?

+0

ループ... –

+0

データはソートされていることが保証されていますか? – Timo

+0

@TimoStaはい、SQLを使用してデータをソートできます。 – Andrej

答えて

1

データは、年によってソートされますと仮定すると、あなたはこのよう.reduce()を使用することができます:欠落しているもののためにエントリを追加し、年を追跡し、アレイ上の

var data = [ { year: 1996, weight: 3}, 
 
    { year: 1999, weight: 2}, 
 
    { year: 2004, weight: 5}, 
 
    { year: 2005, weight: 3}, 
 
    { year: 2006, weight: 2} ]; 
 
    
 
var final = data.reduce(function(prev, curr, index, arr) { 
 
    prev.push(curr); 
 
    if (index < arr.length - 1) { 
 
    var nextYearInData = arr[index + 1].year; 
 
    var yearToAdd = curr.year + 1; 
 
    while (yearToAdd < nextYearInData) { 
 
     prev.push({year: yearToAdd, weight: 0}); 
 
     yearToAdd++; 
 
    } 
 
    } 
 
    return prev; 
 
}, []); 
 

 
console.log(final)

関連する問題