2017-10-17 274 views
0

我有一个2d数组表示数据库中的行。我使用officeJS来加载和处理Excel中的数据。我更新,插入和删除行。我面临的挑战是我需要找出更改的行(插入,删除或更新),以便只更新数据库中的那些行。我发送一个查询更新和插入的行,以及一个查询删除的行。我可以用lodash做5000行10列的数据。我想将其扩展到更大的数据集,我想知道是否有任何替代我目前正在做的。以下是我用来找出差异的代码。大数据集Lodash二维数组比较

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

失败,因为lodash正在崩溃。 –

回答

0

因为您刚才提到您的Javascript引擎崩溃(它不应该在50,000行 - 所以我会再讲逻辑),我会建议使用Lodash的_.chunk功能分块出来的数据:

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

)的方式做一些事情,我应该补充说我正在测试10列而不是4,就像在上面的示例数组中显示的那样。显然,这是添加更多另一种方法是在调用差异之前对每行进行字符串化,以便它可以将整行作为一个元素处理,它适用于20,000条记录,然后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);