如何提高性能

时间:2018-05-18 16:19:42

标签: javascript arrays performance object

我有一个名为record的对象数组,其中包含超过100个字段,我需要映射每个对象以创建一个名为products的数组来添加字符串。我应该如何提高绩效?

由于

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')}
  ...
}

3 个答案:

答案 0 :(得分:0)

&#13;
&#13;
// 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);
}
&#13;
&#13;
&#13;

答案 1 :(得分:0)

在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()

答案 2 :(得分:-1)

您将要创建二叉树。 对于每条记录,您将遵循二叉树中的特定路径。 当您触及底部时,树元素将具有单个字符串数组,您将通过一次调用进行连接。

每个树节点如下所示:

{
 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次连续。

遍历树并不比你已经使用的if语句系列慢,你只是更新单个节点变量而不是使用每个'if'语句进行推送。

由于填充树所需的时间,由于记录数量较少,这可能需要更长时间。但随着记录数量的增加,这将会更快。

树将变大,2到田地数量的幂,这对于100个田地来说是非常大的。因此,您可能希望将其划分为多个树,每棵树有20个字段(每个树中2到20个大约几兆字节)。然后你只需按顺序遍历每棵树。

另一个优化是跳过填充树的第2步,而不是随着时间的推移填充。如果遍历树以获取记录并在最终节点处看到未填充“strings”数组,则重复相同的路径并填充它。