2017-10-17 19 views
0

私はデータベースの行を表す2次元配列を持っています。 Excelでデータを読み込んで操作するためにofficeJSを使用しています。行の更新、挿入、および削除を行います。私が直面している課題は、データベースの行だけを更新できるように、変更された行(挿入、削除または更新)を把握する必要があることです。私は更新され挿入された行と削除された行のための1つのクエリに対して1つのクエリを送信しています。私は5000行10列のデータにlodashを使ってこれを行うことができます。私はもっ​​と大きなデータセットにこれを拡大したいと思いますし、私が現在やっていることに何か他の選択肢があるのだろうかと思っています。以下は違いを見つけるために使用しているコードです。大きなデータセットのLodash 2d配列の比較

insertedOrUpdatedRows = _.differenceWith(modifiedData, originalData, _.isEqual); 

deletedRows = _.differenceWith(originalData, modifiedData, compareFunction); 

function compareFunction(a, b) { 
    if(a[0] == b[0]) { 
     return true; 
    } 
    else 
     return false; 
} 

サンプルデータアレイ

[1、データ、データ、データ]、 [2、データ、データ、データ]

最初の要素は、主キーです。

+0

これはかなりまともな方法であるようです。 – nikjohn

+0

それは5000行10列よりも大きなデータセットでは失敗します。より多くのデータを処理できる方法はありますか?おそらく、データをチャンクにダイビングするのでしょうか? –

+0

ロダシュのように失敗してクラッシュしています。 –

答えて

0

あなたのJavaScriptエンジンがクラッシュしていることを言及しているので(50,000行でそれはいけない、 - 私は、ロジックを再検討するだろう)、私はLodashの_.chunk機能を使用してデータをチャンクをお勧めします:

_.chunk(modifiedData, modifiedData.length/500).map({ 
    ... 
    ... 
}); 
+1

私は上記のサンプル配列に示されているように4つではなく10つの列でテストしています。私が取ったもう1つのアプローチは、行全体を1つの要素として扱うことができるように、各行をストリング化することでした。それは2万レコードで動作し、次にExcelアドインブラウザがクラッシュします。更新をお願いします。助けてくれてありがとう!ありがとう –

0

次のロジックを使用しています。なぜ50K行でクラッシュするのか分かりません。 OriginalDataおよびModifiedDataは、上記のサンプル2D配列の形式です。

var originalDataStrings = []; 
var modifiedDataStrings = []; 
var insertedOrUpdatedRows; 

originalData.forEach(function(row){ 
    originalDataStrings.push(JSON.stringify(row)); 
}); 

modifiedData.forEach(function(row){ 
    modifiedDataStrings.push(JSON.stringify(row)); 
}) 

insertedOrUpdatedRows = _.differenceWith(modifiedDataStrings, originalDataStrings, _.isEqual); 
console.log(insertedOrUpdatedRows);