Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   зачем нужна сортировка NodeList (https://javascript.ru/forum/offtopic/57851-zachem-nuzhna-sortirovka-nodelist.html)

KosBeg 23.08.2015 13:56

зачем нужна сортировка NodeList
 
В Sizzle, QSA, CSS_selector_engine на выходе елементы сортируются, зачем?
return document.querySelectorAll(selector)

против
return Array.prototype.slice.call(document.querySelectorAll(selector))

кто победит? :D
зачем нужна сортировка на выходе?
гуголь не помог... :cray:

Rise 23.08.2015 14:50

KosBeg, ты о чем, при чем здесь сортировка? NodeList - это псевдомассив (при querySelectorAll к тому же не живой), а Array.prototype.slice делает его истинным массивом) с удобными встроенными методами для работы с ним.

KosBeg 23.08.2015 14:56

Цитата:

не живой псевдо массив javascript
понятно, спасибо)

Rise 23.08.2015 15:35

KosBeg,
var falseArray = { // aka Collection (jquery), NodeList, arguments, etc...
	0: 'Вася',
	1: 'Петя',
	length: 2
};

var trueArray = [ // Array.prototype.slice.call(falseArray)
	'Вася',
	'Петя'
];

KosBeg 23.08.2015 19:37

жаль раньше этого не читал - Внутреннее устройство поисковых методов
PS: маленький но продуктивный поиск по селекторам
sel('div', sel('#root'))

(function(window, document) {
  function classOnly_find(klass, root) { // самый продуктывный поиск по класу, не учитывая getElementsByClassName, взял с yass и модифицировал
    try {
      return root.querySelectorAll('.' + selector)
    } catch (e){}

	klass = ' ' + klass + ' '

    var nodes = root.getElementsByTagName('*'),
      i = 0,
      node,
      sets = [],
      idx = 0

    while (node = nodes[i++]) {
      if ((' ' + node.className + ' ').indexOf(klass) != -1) {
        sets[idx++] = node
      }
    }

    return idx ? sets : []
  }

  function sort_elem(elems) { // сортировка елементов
    return Array.prototype.slice.call(elems)
  }

  window.sel = function(selector, root) {
    var root = root || document,
      elem = 0,
      tmp_selector = 0,
      classOnly = /^\.([\w\-]+)$/,
      idOnly = /^#([\w\-]+)$/,
      tagOnly = /^([\w\-]+)$/

    if (classOnly.test(selector)) {
      tmp_selector = selector.slice(1)
      try {
        elem = root.getElementsByClassName(tmp_selector)
        return elem.length ? sort_elem(elem) : []
      } catch (e) {
        return sort_elem(classOnly_find(tmp_selector, root))
      }
    }

    if (idOnly.test(selector)) {
      tmp_selector = selector.slice(1)
      elem = [root.getElementById(tmp_selector)]
      return elem.length ? sort_elem(elem) : []
    }

    if (tagOnly.test(selector)) {
      elem = root.getElementsByTagName(selector)
      return elem.length ? sort_elem(elem) : []
    }

    elem = root.querySelectorAll(selector)
    return elem.length ? sort_elem(elem) : []
  }
})(window, document)

Erolast 24.08.2015 07:03

Цитата:

Сообщение от KosBeg (Сообщение 385249)
return Array.prototype.slice.call(document.querySelectorAll(selector))

Array.from(document.querySelectorAll(selector));

Используйте уже ES6.

FINoM 24.08.2015 15:33

Цитата:

Сообщение от Erolast
Используйте уже ES6.

[...document.querySelectorAll(selector)]

Erolast 24.08.2015 15:52

Цитата:

Сообщение от FINoM (Сообщение 385399)
[...document.querySelectorAll(selector)]

Аха, или так.


Часовой пояс GMT +3, время: 22:42.