我正在进行代码优化,其中我有几行(〜500-1000)至少300列的数据。 数据存储为对象数组:
data = [
{col1: 1,col2: 2,col3: null,col4: 1.3,col5:undefined,col6: 2,....},{col1: 3,col2: 4,col3: 3,col4: 1.1,col5:8,.
.
.
{col1: 1.1,col2: 1.2,col3: 7,col4: 3,col5:4,....}
]
然后,我还有另一个名为计算器的对象数组,它们是用户定义的计算。这些计算可以在下面的数组中包含另一个计算出的变量,例如第二个对象。 所以我需要保持顺序。
calculators = [
{formula:'col1 + sin(col2)',order:0,colname: 'calc1'}
{formula:'calc1 * col6',order:1,colname: 'calc2'}
.
.
.
{formula: 'any random calculation',order:n,colname:'RandomName'}
]
我当前的代码流是
- 从计算器中提取相关列,例如col1和col2
对于来自calc2的calc1和col6。
dependentCols = [col1,col2,col6]
- 使用嵌套的for循环遍历数据数组,用于计算器和列,并在解析器中为每个值设置值
从属列。
parser.set(column,row[column]);
- 然后进行公式求值并将该值附加到dararow。
我拥有的原始代码包括一些其他内容,用于处理子列,单元和其他内容。这就是为什么不粘贴原始代码,而是草稿的原因。
const parser = math.parser();
data = _.map(data,row=>{
row = {...row};
_.forEach(calculators,(calculator)=>{
_.forEach(dependentCols,col=>{
// cannot add the whole row as it is because of the sub-column stuff.
parser.set(col,row[col]);
});
try {
const value = parser.eval(calculator.formula);
row[colname] = value;
} catch (exception) {
console.warn(parser,exception,calculator.colname);
}
}
});
return row;
});
}
原始代码肯定有效(一年)。它非常缓慢,有450行和20次计算,最多需要12秒。 因此,我不是在逐行且逐个单元地进行有效处理,而是在考虑将整列同时传递给eval函数。但是我找不到任何支持文档。
任何帮助将不胜感激。