Как увеличить производительность - PullRequest
0 голосов
/ 18 мая 2018

У меня есть массив объектов, называемых записями, с более чем 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 голосов
/ 18 мая 2018

В 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()
0 голосов
/ 18 мая 2018

Вы хотите создать двоичное дерево.Для каждой записи вы будете следовать определенному пути через двоичное дерево.Когда вы дойдете до дна, у элемента дерева будет один массив строк, который вы будете объединять с помощью одного вызова.

Каждый узел дерева выглядит следующим образом:

{
 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» не заполнен, вы повторяете тот же путь и заполняете его.

0 голосов
/ 18 мая 2018

// 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...