Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Метод remove() в стандартном Array (https://javascript.ru/forum/extjs/11705-metod-remove-v-standartnom-array.html)

voyager 08.09.2010 14:53

Метод remove() в стандартном Array
 
Вот хотел поинтересоваться, это ни кому не мешает?
Я так понимаю, Ext где-то доопределяет стандартный класс array, добавляя в него метод remove(). И хоть длина массива определяется корректно, после этого любой for in по массиву натыкается на этот remove...
Ну т.е.:
var mycars = new Array();
mycars[0] = "Saab";
mycars[1] = "Volvo";
mycars[2] = "BMW";

по
for (var x in mycars)
{
 alert(mycars[x]);
}

Получим:
"Saab"
"Volvo"
"BMW"
и, соответственно, код remove()...
Как бы вы посоветовали решить эту проблему?

Kolyaj 08.09.2010 14:56

Цикл for-in перебирает свойства объекта, коим является и remove. Для перебора элементов массива используется обычный цикл for.

http://alljs.ru/articles/array/iteration.html

Sweet 08.09.2010 15:02

Используй hasOwnProperty. Должно помочь
UPD А вообще, конечно, такой способ перебора не для массивов

voyager 08.09.2010 15:08

Цитата:

Сообщение от Kolyaj (Сообщение 70139)
Цикл for-in перебирает свойства объекта, коим является и remove. Для перебора элементов массива используется обычный цикл for.

http://alljs.ru/articles/array/iteration.html

Это понятно. Но вы полагаете удобно использовать for вместо for in? Только потому что, библиотеке вздумалось изменить стандартный класс все ранее написанные скрипты нужно переделать?

Цитата:

hasOwnProperty
Не совсем понял, как это должно мне помочь?
Цитата:

UPD А вообще, конечно, такой способ перебора не для массивов
UPD: Ок, а как тогда пробежаться по хэшу, когда мне нужны и ключи и значения?

Sweet 08.09.2010 15:22

Цитата:

Сообщение от voyager
Не совсем понял, как это должно мне помочь?

я думаю, remove() из прототипа
Цитата:

Сообщение от voyager
как тогда пробежаться по хэшу, когда мне нужны и ключи и значения?

Если под хэшем подразумевается объект, то конечно for-in. А если массив - то for.

Kolyaj 08.09.2010 15:24

Цитата:

Сообщение от voyager
Но вы полагаете удобно использовать for вместо for in?

Это не я предлагаю использовать for вместо for-in, а вы используете for-in вместо for. Ещё раз: for-in перебирает свойства объекта, а не только целочисленные свойства, коими являются элементы массива. Так почему вы жалуетесь, что for-in захватывает кастомные методы? Он для этого и предназначен.

Цитата:

Сообщение от voyager
Только потому что, библиотеке вздумалось изменить стандартный класс все ранее написанные скрипты нужно переделать?

Не класс, а прототип. И не изменить, а добавить метод. Это вполне легальная ситуация. По ссылке выше описан случай, когда for-in взрывается и без добавления методов в прототип.
И да, если скрипты написаны неправильно, их нужно переписать.

Цитата:

Сообщение от voyager
а как тогда пробежаться по хэшу, когда мне нужны и ключи и значения?

А тут в чём проблема?

voyager 08.09.2010 15:40

Ок, пример был несколько упрощен. На самом деле работа идет не с массивами а фактически с объектами.
mycars['xxx'] = "Saab";
mycars['www'] = "Volvo";
mycars['eee'] = "BMW";

И когда мне нужны не только значения но и ключи в ход идет:
for (var x in mycars)  
{  
   alert(x +' - '+mycars[x]);  
}

Тепрь, насколько я понимаю, мне везде прийдется вставить if hasOwnProperty...

Kolyaj 08.09.2010 15:45

Цитата:

Сообщение от voyager
На самом деле работа идет не с массивами а фактически с объектами.

Так и используйте объекты.
http://alljs.ru/articles/array/whatis.html#assoc
var mycars = {};
mycars['xxx'] = "Saab";
mycars['www'] = "Volvo";
mycars['eee'] = "BMW";

А лучше
var mycars = {
    xxx: 'Saab',
    www: 'Volvo',
    eee: 'BMW'
};

Object.prototype никто не трогает, как правило, hasOwnProperty не нужен будет.

voyager 08.09.2010 15:48

Это все логично, спасибо. Но мне уже такой JSON приходит, где это массивы :(.

Kolyaj 08.09.2010 15:49

Не может вам такой JSON приходить. Или это не JSON.


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