Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Быстрый разбор списка элементов. (https://javascript.ru/forum/misc/10590-bystryjj-razbor-spiska-ehlementov.html)

B~Vladi 11.07.2010 12:23

Быстрый разбор списка элементов.
 
Всем мир.
На самом деле не надеюсь, что решение есть, но рискну спросить.
Как преобразовать список элементов в строку или массив?

Я пробовал так:
var arr = Array.prototype.slice.call(document.getElementsByTagName('*'));

и так:
var arr = Array.prototype.join.call(document.getElementsByTagName('*'));


и так:
function test(){
  var arr = Array.prototype.slice.call(arguments);
}
test.apply({}, document.getElementsByTagName('*'));


Осел такие трюки не понимает. Как его проучить?

И почему он arguments может преобразовать в массив, а список элементов и атрибутов нет?

зы: хотя я подозреваю почему... arguments - объект JScript, а остальное объекты DOM.

e1f 11.07.2010 14:46

Скорее всего, никак:
http://javascript.ru/forum/events/41...kh-tehgov.html

Octane 11.07.2010 14:57

Цитата:

Сообщение от B~Vladi
Я пробовал так:
var arr = Array.prototype.slice.call(document.getElementsByTagName('*'));

Цитата:

Сообщение от B~Vladi
Осел такие трюки не понимает.

IE9 теперь умеет так делать.

Цитата:

Сообщение от B~Vladi
Как его проучить?

// Преобразует NodeList в Array
// Реализация только для Standards Compliant Mode
if (!Array.toArray) {
	try {

		// IE9 и все остальные браузеры поддерживают преобразование NodeList в массив при помощи slice.
		Array.prototype.slice.call(document.childNodes); // IE6–8 здесь выбросят исключение.
		Array.toArray = function (slice) {
			return function (anything) {
				return slice.call(anything);
			};
		}(Array.prototype.slice);

	} catch (error) {

		Array.toArray = function (anything) {
			var length = anything.length, i = -1, array = [];
			if (length) {
				while (++i < length) {
					array[i] = anything[i];
				}
			}
			return array;
		};

	}
}

Riim 11.07.2010 16:04

Многие браузеры тупое переписывание выполняют быстрее чем slice.call . Так-что смысла нет столько всего писать, достаточно просто:
Array.toArray = function $A(iterable) {
	if (iterable) {
		var result = [], i = iterable.length;
		while (i) result[--i] = iterable[i];
		return result;
	}
	return [];
};

B~Vladi 11.07.2010 16:10

Octane, я так и думал, что без цикла не обойтись.
Раз уж так все плохо, то я бы для ишака максимально оптимизировал код:
Array.toArray = function (anything) {
  var l = anything.length;
  while (length--) {
    array[i] = anything[i];
  }
  return array;
};

Всем спасибо.

B~Vladi 11.07.2010 16:11

Цитата:

Сообщение от Riim
Многие браузеры тупое переписывание выполняют быстрее чем slice.call

Надо будет потестить.

Riim 11.07.2010 16:37

Цитата:

Сообщение от B~Vladi
while (length--) {

в последней итерации происходит лишнее перезаписывание переменной length. Не понимаю почему все так делают.

B~Vladi 11.07.2010 19:18

Цитата:

Сообщение от Riim
в последней итерации происходит лишнее перезаписывание переменной length

Есть вариант по-лучше?

e1f 11.07.2010 19:37

Цитата:

Сообщение от B~Vladi (Сообщение 63217)
Есть вариант по-лучше?

Array.toArray = function(anything) {
  var array = [];
  for (var l = anything.length, l--; ) {
    array[i] = anything[i];
  }
  return array;
};


UPD Хотя нет, туплю, тут тоже лишняя перезапись есть :)

рони 11.07.2010 20:29

просто как вариант...может так?
var r = document.getElementsByTagName("*");
Array.a = function (a) {
    var b = [];
    for (var c in a) if (typeof a[c] == "object") b[b.length] = a[c];
    return b
};
r = Array.a(r);

)))


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