[英]How to increase the performance
我有一个称为记录的对象数组,具有超过100个字段,并且我需要映射每个对象以创建一个名为product的数组以添加字符串。 我应该如何提高性能?
谢谢
for (var i = 0; i < records.length; i++) {
var products = []
if (records[i].Custom_BA1__c === 'true'){ products.push('Custom BA1')}
if (records[i].Custom_Web_Sim__c === 'true'){ products.push('Custom Web Sim')}
if (records[i].Finance_for_Non_Financials__c === 'true'){ products.push('Finance for Non Financials')}
if (records[i].Custom_Board__c === 'true'){ products.push('Custom Board')}
...
}
// Data from somewhere else var records = [{ "Custom_BA1__c": "true", "Custom_Web_Sim__c": "false", "Finance_for_Non_Financials__c": "true" }]; var mapping = { "Custom_BA1__c": "Custom BA1", "Custom_Web_Sim__c": "Custom Web Sim", "Finance_for_Non_Financials__c": "Finance for Non Financials" }; for(let record of records){ let products = Object.entries(record) .filter(([k,v]) => v === "true") // filter the ones that are "true" .map(([k,v]) => mapping[k]); // map them to the correct names console.log(products); }
在ES6中:
let products = records.map(record => {
let mapping = {
'Custom_BA1__c': 'Custom BA1',
'Custom_Web_Sim__c': 'Custom Web Sim',
'Finance_for_Non_Financials__c': 'Finance for Non Financials',
'Custom_Board__c': 'Custom Board'
}
return Object.keys(mapping).filter(key => record[key]).map(key => record[key])
}).flatten()
您将要创建一个二叉树。 对于每条记录,您将通过二叉树遵循特定的路径。 当您触底时,tree元素将具有一个字符串数组,您可以通过一个调用来连接它们。
每个树节点如下所示:
{
var str;
var strings;
var left, right;
}
您将分两步填充树。
第一次,在每个级别中,您都要输入该级别的字符串。
root
left Node {str: 'Custom BA'} right Node {str: ''}
left Node {str: 'Custom Web Sim'} right Node {str: ''} left Node {str: 'Custom Web Sim'} right Node {str: ''}
第二次,在每个级别,您将放入该级别的聚集数组。
root
left Node {strs: 'Custom BA'} right Node {strings: []}
left Node {strings: ['Custom BA', 'Custom Web Sim']} right Node {strings: ['Custom BA']} left Node {strings: ['Custom Web Sim']} right Node {strings: []}
现在,一旦填充了数组(给定了任何记录),您就可以遍历树到底部。 在每个级别上,如果给定字段为“ true”,则向左移动,否则为向右移动。 基本上,您正在遍历过程中将单个节点变量更新为当前节点。 到达底部后,您将调用:
products.concat(node.strings)
您为什么这么快? 因为不是每条记录执行100次推送,而是每条记录执行1次concat。
遍历树并不比您已经拥有的一系列if语句慢,您只是在更新单个节点变量,而不是对每个'if'语句进行推送。
对于少量记录,由于填充树所花费的时间,这可能需要更长的时间。 但是随着记录数量的增加,记录速度会更快。
该树将变大,是场数的2的幂,这对于100场来说是非常大的。 因此,您可能希望将其划分为几棵树,每棵树20个字段(2到20个字段大约每棵树几兆字节)。 然后,您只需要依次遍历每棵树即可。
另一种优化是跳过填充树的步骤2,而是在进行时填充。 如果遍历该树以获取记录,并在最后一个节点处看到未填充“字符串”数组,则重复相同的路径并进行填充。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.