2014-10-16 2 views
0

Мне было интересно, можете ли вы помочь мне сократить количество операций в следующей функции.Как я могу оптимизировать эту функцию, чтобы сделать произвольное число divs одинаковой высоты?

function equi_hghts (S) 
{ 
/* S: Array of strings which are selectors of elements which are to be given the same height */ 
    var n = S.length; 
    var ES = []; /* Elements selected by S */ 
    for (var i = 0; i < n; ++i) 
     ES.push($(S[i])); 
    var maxHeight = 0; 
    for (var i = 0; i < n; ++i) 
    { 
     var thisHeight = ES[i].height; 
     if (thisHeight > maxHeight) 
      maxHeight = thisHeight; 
    } 
    for (var i = 0; i < n; ++i) 
    { 
     ES[i].height(maxHeight); 
    } 
} 

Например, я знаю, что кусок

for (var i = 0; i < n; ++i) 
    { 
     ES[i].height(maxHeight); 
    } 

будет иметь 1 бесполезную операцию, так как один DIV будет получать набор до высоты, это уже в. Я также ищу способ сократить количество циклов.

И есть еще одна вещь, которая поможет: После следующей порции

for (var i = 0; i < n; ++i) 
    ES.push($(S[i])); 

Я хотел бы удалить память, выделенную для S. Спасибо.

ответ

1

Что-то вроде

var maxHeight = S.map($) 
    .reduce(function(prev,curr){ 
     return Math.max(prev,curr.height()); 
    },0); 
$(S.join(",")).height(maxHeight); 

или

var q=$(S.join(",")); 
q.height(
    q.toArray().reduce(function(prev,curr){ 
     return Math.max(prev,curr.height()); 
    },0)); 
+0

Мне нравится этот подход. Передача функции jQuery для отображения является блестящей, как и объединение массива в конце. Однако это вызовет 2 просмотра DOM для каждого элемента. Я бы сказал, что это оптимизировано для удобства чтения, но вы можете сделать лучше для производительности, чтобы он работал с одним поиском для каждого элемента. – Malk

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