2016-03-26 3 views
-1

У меня есть структура вложенных объектов, и я выполняю серию операций над каждым объектом, а затем я нажимаю его на массив. Мой текущий код выглядит так:Оптимизация перемещения вложенных объектов

var item; 
var final_data = []; 

function walk (items, level) { 
    for (var i = 0; i < items.length; i++) { 
     item = items[i]; 

     var final_item = Object.assign({}, item); // <-- required step, object's proper key/values must be cloned, but not recursively. 
     delete final_item.children; // final_item shouldn't have children 

     final_item.foo = level; 

     final_data.push(final_item); 

     if ("children" in item) walk(item.children, level + 1); 
    } 

} 

walk(my_data, 0); 

Мой текущий код работает должным образом, как и в случае, он выравнивает входные данные.

Мой вопрос в том, есть ли способ улучшить этот код (качество работы).

Edit:

my_data представляет собой массив вложенных объектов, например:

my_data = [ 
    {a: 1, b: 2}, 
    {a: 3, b: 8}, 
    {a: 9, b: 3, children: [ 
     {...}, {...}, {...} 
    ]}, 
    {...}, 
    {..., children: [{}, {}, {}...]} 
]; 
+0

Вы испытываете проблемы масштабирования или вы просто пытаетесь будущим доказательство его? –

+0

@mederomuraliev Ни один из них на самом деле. Я просто пытаюсь сжать всю производительность, которую я могу получить, поскольку эта кодировка довольно дорога. – alexandernst

+0

Удалить рекурсию всегда является первым шагом для улучшения – VinhNT

ответ

1

Единственное, что я могу сразу увидеть, является оптимизации циклов, назначая .Length к переменной

т.е. :

for (var i = 0, j = items.length; i < j; i++) 

вместо

for (var i = 0; i < items.length; i++) 

Вот ответ на другой пост для большего понимания: Javascript Optimizing Loops

+1

По сравнению со всем остальным это будет тривиальная микро-оптимизация, и в эти дни JS-двигатели все равно оптимизируют его. –

+0

В прошлый раз, когда я проверил, эта «оптимизация» была такой же быстрой, как «неоптимизированный» код в Chrome, и даже немного медленнее в Firefox. Поэтому я больше не рекомендую его. – Oriol

+0

Буферизация по длине очень помогла IE, которая уже очень медленная, поэтому, если это стирка других мест, она все равно должна быть выполнена. много пещерных людей все еще там, и что оптимизация безболезненна ... $ 0.02 – dandavis

-1

Если вы собираетесь на производительность, да, это определенно может быть улучшена. Object.assign не требуется, а создание и уничтожение объектов крайне неэффективны в javascript. Прибыль от назначения длины переменной будет незначительной по сравнению с прибылью от ее удаления.

+2

Будет создание объекта, независимо от того, что-OP начали клонировать, нет? –

+0

Нет, если он изменяет исходный объект. –

+0

Я четко заявил, что назначение требуется. – alexandernst

1

Чтобы удалить рекурсию, я использую массив как стек и нахожусь во всем узле «my_data», узнайте, есть ли дети и нажмите все дочерние элементы в стеке. Затем удалите ребенок и нажмите посещаемый узел в конечном результате

var item; 
var final_data = []; 

function walk(items, level) { 
    var stack = items; 

    while (stack.length > 0) { 
     item = stack.shift(); 
     if ("children" in item) { 
      var x = Object.assign({}, item) 
      var children = item.children; 
      // console.log(children); 
      for (var z = 0; z < children.length; z++) { 
       stack.push(children[z]); 
      } 
     } 
     delete item.children; 
     final_data.push(item); 
    } 
} 

walk(my_data, 0); 
for (var i = 0; i < final_data.length; i++) { 
    //console.log(final_data[i].a); 
} 
+0

Последний цикл в фрагменте для результата тестирования, jsfiddle: https://jsfiddle.net/cleopart/hx7espr9/ – VinhNT

+0

Шляпы к Роду Харперу, это действительно хорошая работа! – dandavis

+0

Это не будет обрабатывать вложенные объекты более 1 уровня. – alexandernst

Смежные вопросы