Самый эффективный способ найти самый левый div? - PullRequest
2 голосов
/ 22 октября 2010

Используя jQuery или прямой Javascript, я ищу лучший способ найти самый левый div (или вообще элемент DOM с минимальной или максимальной позицией на любой оси).

Пока у меня есть два решения:

  1. Перебирайте объекты div, которые я хочу рассмотреть, сохраняя наименьшую найденную левую позицию.
  2. Создание массива объектов и использование функции sort () javascript с функцией сравнения, которая смотрит на свойство left, затем выбирает 0-й элемент.

Я знаю, что решением 1 будет O (N), но я не уверен, какова эффективность функции sort () в большинстве браузеров, или если существует совершенно другой подход.

Ответы [ 3 ]

2 голосов
/ 22 октября 2010

Вероятно, не получится ничего лучше, чем O (n), и лучшая чистая сортировка - O (nlogn). Самый быстрый способ - пройтись по DOM. Я бы назвал getElementsByTagName ("div") и выполнял бы итерацию, отслеживая самый левый элемент.

function findLeftMostDiv() {
    var leftest = { "left": 999999999999, elem: null };
    var divs = document.getElementsByTagName("div");

    for(i=0; i<divs.length; i++) {
        var div = divs[i];
        var curleft = findPos(div);
        if(curleft < leftest.left) {
            leftest.left = curleft;
            leftest.elem = div;      
        } 
    } 
    return leftest.elem;               
}

function findPos(obj) {
    var curleft=0;
    if(obj.offsetParent) {
        do {
            curleft += obj.offsetLeft;
        } while (obj = obj.offsetParrent);
    }
    return curleft;
}
2 голосов
/ 22 октября 2010

вариант 1: повторять его только один раз

var $smallest = {left: 000000000, item: null};
var $left = 0;
$('selector').each(function(){
    $left = $(this).offset().left;
    if ($left < $smallest.left)
    {
        $smallest.left = $left;
        $smallest.item = this;
    }
});

вариант 2: повторить его как минимум дважды

var $array = [];
$('selector').each(function(){
    var $this = $(this);
    $array.push({left: $this.offset().left, item: this});
});
$array.sort(function(a,b){
    if (a.left < b.left) return -1;
    if (a.left > b.left) return 1;
    return 0;
});
// smallest is $array[0]

опция 1 всегда быстрее в этом случае, поскольку вам нужно только отсортировать ее при выборе, в этом случае сортировка почти бесплатна.

edit: конечно, использование только DOM для этого снова, намного быстрее.

2 голосов
/ 22 октября 2010

Учтите это:

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

Что вы думаетесамый быстрый?:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...