PDA

Просмотр полной версии : getItemIndex не работает!


Aleksey123
13.11.2006, 19:33
var myArray :ArrayCollection = new ArrayCollection
([{name:"field1",dat:"AZ"},{name:"field2",dat:"MA"},{name:"field3",dat:"MZ"}]);

var dt:Object = {name:"field1", dat:"AZ"};

trace(myArray.getItemIndex({name:"field2", dat:"MA"}));// -1
trace(myArray.getItemIndex(dt));// -1

trace(myArray.getItemAt(0) == {name:"field1",dat:"AZ"});//false
trace(myArray.getItemAt(0) == dt);//false


Почему выводит -1?:umnik2:

etc
13.11.2006, 20:12
Потому что это разные объекты.

Aleksey123
13.11.2006, 20:18
Офигенно. Что значит разные? поподробнее можно? А кто-нибудь может исправить код?

etc
13.11.2006, 20:19
А что ты хочешь сделать?

Aleksey123
13.11.2006, 20:39
Хочу узнать номер строки таблицы если мне известно содержимое ячейки.

etc
13.11.2006, 20:43
Нужно рыть весь массив и проверять соответствие всех свойств простого типа.
getItemIndex возвращает индекс элемента в коллекции, а параметром является ссылка конкретно на этот элемент, а не на другой созданный.

Aleksey123
14.11.2006, 02:09
Можешь написать маленький примерчик где используется ссылка на элемент в коллекции использую getItemIndex?:away:

Aleksey123
14.11.2006, 11:53
public var myArray=new ArrayCollection
([{name:"field1",dat:"AZ"},{name:"field2",dat:"MA"},{name:"field3",dat:"MZ"}]);

public var myCursor:IViewCursor;
myCursor=myArray.createCursor();
for(var i:int=0;i<myArray.length;i++){
if(myCursor.current.name=="field2")
trace("FOUND");

if(myCursor.current.name==dt.name && myCursor.current.dat==dt.dat)//Можно как-нибудь проще записать?
trace("FOUND2");

myCursor.moveNext();
}
// if(myCursor.current==dt) не работает!


Так работает. А вот как использовать getItemIndex так и не понял. Хорошо бы пример посмотреть.

__i
14.11.2006, 19:50
getItemIndex возвращает индекс конкренного ЭКЗЕМПЛЯРА твоего объекта.


var a:Object = { par1 : 1, par2 : 2}
var b:Object = { par1 : 1, par2 : 2}

var linkToA: Object = a;

trace(a==b) //false
trace(a==linkToA) // true

почему так?
потому что a и b хранят ссылки на ячейки памяти с данными, а не сами данные.
Со стороны кажеться что у a и b одинаковые данные, но они храняться в разных ячейках памяти. При их сравнении сравниваеться не данные на которые они ссылаються а именно адреса этих ячеек памяти.

a==linkToA - true потому что мы linkToA присвоили значение адреса ячейки памяти.
Если бы ты програмил на Assembler, C/C++, Pascal на худой конец, для DOS то было бы легче с этип разобраться - там "осязаемые" ячейки памяти. В As3 тоже самое, только эти ячейки не такие очевидные.

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

Для твоего случая __etc все верно описал.

Aleksey123
14.11.2006, 22:36
Тогда вот такой код получается:

var myArray :ArrayCollection = new ArrayCollection
([{name:"field1",dat:"AZ"},{name:"field2",dat:"MA"},{name:"field3",dat:"MZ"}]);

var dt:Object = {name:"field1", dat:"AZ"};
var linkdt:Object=myArray[1];
trace(myArray.getItemIndex({name:"field2", dat:"MA"}));// -1
trace(myArray.getItemIndex(dt));// -1

trace(myArray.getItemAt(0) == {name:"field1",dat:"AZ"});//false
trace(myArray.getItemAt(0) == dt);//false
trace(myArray.getItemAt(1) == linkdt);//true


Получается что это функция не удобная, где ее применять не понятно.

И еще. Если у меня 10 полей в таблице или больше мне каждый раз писать
if(myCursor.current.pole1==dt.pole1 &&
my Cursor.current.pole2==dt.pole2)&&
..............................
my Cursor.current.pole3==dt.pole10)

Или можно проще сделать?

__i
15.11.2006, 12:48
Тогда вот такой код получается:
Получается что это функция не удобная, где ее применять не понятно.

ну почему же, допустим любая функция которая выбирает элемент из списка, возвращает тем или иным образом ссылку на выбраный объект, а не на его копию.

Или можно проще сделать?
ну например написать в твоем классе функцию которая возвращает "равны" ли объектны или нет и юзать ее а на огромный if

Aleksey123
15.11.2006, 16:53
А как это функия будет выглядеть? внутри нее эти ifы написать?
Ведь такое выражение всегда false вернет

if(myCursor.current==dt)

__i
15.11.2006, 19:54
public function isEqual(toEqual : YoDataClass) : Boolean
{

return this.someParam1 == toEqual.someParam1 && this.someParam2 == toEqual.someParam2
}

немного извратившись можно сделать так

private var propToCompare:Array = ['someParam1', 'someParam2'];
.........
public function isEqual(toEqual : YoDataClass) : Boolean
{
for (var i:Number = 0; i< propToCompare.length; i++)
{
if (this[propToCompare[i]]!=this[toEqual [i]])
return false;

}
return true
}


использование


if (myCursor.current.isEqual(dt))
{
trace('is Equal');
}
else
{
trace('is not Equal');
}

Aleksey123
16.11.2006, 01:52
Спасибо за подробный ответ :victory:

etc
16.11.2006, 19:30
getItemIndex полезен, когда у тебя есть ссылка на элемент в массиве (коллекции) и тебе надо узнать его индекс.