Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Добавил Array.prototype.count, но появилась проблема... (https://javascript.ru/forum/misc/16990-dobavil-array-prototype-count-no-poyavilas-problema.html)

khusamov 01.05.2011 23:58

Добавил Array.prototype.count, но появилась проблема...
 
Здравствуйте!

Добавил метод подсчета числа элементов:

Array.prototype.count = function() {
	var result = 0;
	for(var i in this) {
		if (!this.hasOwnProperty(i)) continue;
		result++;
	}
	return result;
};


Но он выдает на один больше число.

Выяснил что оказывается среди подсчитываемых индексов i попадается и добавленный метод count.

Скорректировал так:

Array.prototype.count = function() {
	var result = 0;
	for(var i in this) {
		if (!this.hasOwnProperty(i) || i == "count") continue;
		result++;
	}
	return result;
};


Вопрос, почему не попадаются прочие методы (push, pop и пр.)?

И что делать, когда я добавлю еще методы в Array.prototype?

B@rmaley.e><e 02.05.2011 00:25

Цитата:

Сообщение от khusamov
Вопрос, почему не попадаются прочие методы (push, pop и пр.)?

Потому что у них есть атрибут DontEnum
Цитата:

Сообщение от khusamov
И что делать, когда я добавлю еще методы в Array.prototype?

Не добавлять их туда.

К слову, ES5 позволит наконец указывать атрибуты вроде DontEnum для своих свойств, так что можете подождать повсеместной имплементации нового стандарта.

UPD: как заметил Sweet, в данном случае такой проблемы не должно быть, т.к. hasOwnProperty('count') вернет false.

Sweet 02.05.2011 01:13

Что за гонево?!:blink: Есть проверка hasOwnProperty, так что метод нормально считает.

Kolyaj 02.05.2011 08:51

Не надо перебирать массивы циклом for-in.

khusamov 02.05.2011 12:56

Цитата:

Что за гонево?!
Дык проверял же. Действительно на единичку больше считает.

Цитата:

Не надо перебирать массивы циклом for-in.
У меня попадаются массивы с разрывом индексов. На этом сайте есть статья об этом. Потому и for-in использую.

Цитата:

подождать повсеместной имплементации нового стандарта.
Это конечно хорошо, но хочется решение для текущей ситуации выработать)))

Цитата:

UPD: как заметил Sweet, в данном случае такой проблемы не должно быть, т.к. hasOwnProperty('count') вернет false.
Странно. Но у меня точно считает на единицу больше. Сейчас попробую локализовать траблу в одном файле.

Kolyaj 02.05.2011 13:00

Цитата:

Сообщение от khusamov
У меня попадаются массивы с разрывом индексов.

Ну и что? http://alljs.ru/articles/array/iteration.html

khusamov 02.05.2011 13:06

Действительно гонево, хуже некуда...

Код:

<script type="text/javascript">
	Array.prototype.count = function() {
		var result = 0;
		for(var i in this) {
			if (!this.hasOwnProperty(i)) continue;
			result++;
		}
		return result;
	};
</script>

<script type="text/javascript">
	var arr = ["один", "два", "три"];
	alert(arr.count());
</script>


...отрабатывает верно. Выдает 3 на выходе.

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

Спасибо за отклики!


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