繁体   English   中英

如何提高性能

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM