Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.05.2011, 23:58
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Добавил 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?
Ответить с цитированием
  #2 (permalink)  
Старый 02.05.2011, 00:25
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Сообщение от khusamov
Вопрос, почему не попадаются прочие методы (push, pop и пр.)?
Потому что у них есть атрибут DontEnum
Сообщение от khusamov
И что делать, когда я добавлю еще методы в Array.prototype?
Не добавлять их туда.

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

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

Последний раз редактировалось B@rmaley.e><e, 02.05.2011 в 02:25.
Ответить с цитированием
  #3 (permalink)  
Старый 02.05.2011, 01:13
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Что за гонево?! Есть проверка hasOwnProperty, так что метод нормально считает.
Ответить с цитированием
  #4 (permalink)  
Старый 02.05.2011, 08:51
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Не надо перебирать массивы циклом for-in.
Ответить с цитированием
  #5 (permalink)  
Старый 02.05.2011, 12:56
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

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

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

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

Цитата:
UPD: как заметил Sweet, в данном случае такой проблемы не должно быть, т.к. hasOwnProperty('count') вернет false.
Странно. Но у меня точно считает на единицу больше. Сейчас попробую локализовать траблу в одном файле.
Ответить с цитированием
  #6 (permalink)  
Старый 02.05.2011, 13:00
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от khusamov
У меня попадаются массивы с разрывом индексов.
Ну и что? http://alljs.ru/articles/array/iteration.html
Ответить с цитированием
  #7 (permalink)  
Старый 02.05.2011, 13:06
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

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

Код:

<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 на выходе.

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

Спасибо за отклики!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с Popup окном vovuslik jQuery 5 12.06.2010 16:12
Проблема с дизайном после отправки xmlhttprequest, Проблема с дизайном после отправки cyberx AJAX и COMET 3 01.05.2010 17:07
Проблема с CSS COKOJIOB (X)HTML/CSS 5 04.08.2009 14:19
Проблема, в менюшке Большой джо Элементы интерфейса 0 12.07.2009 17:12
Проблема спама lliberty AJAX и COMET 1 12.03.2009 16:47