大型数据集的Lodash 2d数组比较

时间:2017-10-17 18:23:09

标签: javascript lodash office-js

我有一个表示数据库中行的二维数组。我正在使用officeJS来加载和操作Excel中的数据。我更新,插入和删除行。我面临的挑战是我需要弄清楚已更改的行(插入,删除或更新),以便我只能更新数据库中的那些行。我正在为已更新和插入的行发送一个查询,并为已删除的行发送一个查询。我可以使用lodash为5000行和10列的数据执行此操作。我想将其扩展为更大的数据集,我想知道我目前正在做什么的替代方案。下面是我用来找到差异的代码。

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,数据,数据,数据]]

第一个元素是主键。

2 个答案:

答案 0 :(得分:0)

因为你已经提到你的Javascript引擎崩溃了(它不应该是50,000行 - 所以我会重新审视逻辑),我建议使用Lodash的_.chunk函数来分块数据:

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

答案 1 :(得分: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);