Вы хотите создать двоичное дерево.Для каждой записи вы будете следовать определенному пути через двоичное дерево.Когда вы дойдете до дна, у элемента дерева будет один массив строк, который вы будете объединять с помощью одного вызова.
Каждый узел дерева выглядит следующим образом:
{
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» не заполнен, вы повторяете тот же путь и заполняете его.