2016-12-09 4 views
4
for (i = 0; i < $('body > p font i').length; i++) { 
    current = [$('body > p font i').eq(index), $('body > p font i').eq(index).index('body > p font u, body > p font i')]; 
    getState(current[1]); 
} 

function getState(index) { 
    // Lookup the object's index, then crawl up until you find a match 
    while ($('body > p font u, body > p font i').eq(--index).filter('u').length == 0); 
    console.log($('body > p font u, body > p font i').eq(index).text()); 
} 

Довольно простой вопрос. Я повторяю набор результатов jQuery против фильтра селектора, пока не нахожу совпадение, поднимаясь по результирующему набору, когда я иду.Почему эта петля становится все медленнее?

Чем дольше этот цикл работает, тем медленнее он становится почти экспоненциально.

+4

ли вы имеете в виду, чтобы иметь точку с запятой в конце этой первой строки? –

+0

Да, я хочу найти индекс результата сопоставления. Добавлен код для уточнения. – Thirk

+0

используйте 'i' вместо индекса. во второй строке + почему вы храните элемент в массиве, если вам нужен только второй элемент. – Mahi

ответ

2

Вы seraching в дереве DOM на каждой итерации, которая является дорогостоящей операцией, решение кэша:

var nodes = $('body > p font i'); 
for (var i = 0, size = nodes.length; i < size; i++) { 
    current = [nodes.eq(index),nodes.eq(index).index('body > p font u, body > p font i')]; 
} 
+0

В самом деле, я получаю этот бит. Почему он заставляет его замедляться с течением времени, а не просто замедляться в первую очередь? Он кэшируется где-то снова и снова? – Thirk

+0

@Thirk Если вы двигаетесь * назад * через список, тогда первый раз вы проверяете только один элемент, затем два, затем три и т. д. и т. д. –

+0

@kidwon Что делать, если что-то добавить элемент в тело? – Mahi