Как бы я удалить «строку» в массиве в зависимости от значения элемента? - PullRequest
1 голос
/ 24 марта 2011

Вот что я сейчас делаю / пытаюсь сделать, чтобы достичь своей цели.Но это не удаление «строки» так, как мне бы хотелось.

Итак, я создаю объект, затем помещаю его в массив.И добавление к части массива работает нормально и так, как я и ожидал.

var nearProfileInfoObj:Object = new Object();
nearProfileInfoObj.type = "userInfo";
nearProfileInfoObj.dowhat = "add";
nearProfileInfoObj.userid = netConnection.nearID;
nearProfileInfoObj.username = username_input_txt.text;
nearProfileInfoObj.sex = sex_input_txt.selectedItem.toString();
nearProfileInfoObj.age = age_input_txt.selectedItem;
nearProfileInfoObj.location = location_input_txt.text;
nearProfileInfoObj.headline = headline_input_txt.text;

theArray.push(nearProfileInfoObj);

Так что позже мне нужно будет удалить этот объект из массива, и он не будет работать так, как яЯ ожидаю.Я хочу взять переменную whoLeft и захватить их ID, а затем поискать в массиве этот конкретный ID в части идентификатора пользователя объекта, и, если он существует, УДАЛИТЬ всю эту «строку».

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

whoLeft = theiruserIDVariable;
theArray.filter(userLeaving);

public function userLeaving(element:*, index:int, arr:Array):Boolean
{

    if (element.userid == whoLeft)
        {

            return false;
        }
        else
        {
            return true;
        }
}

Но, похоже, это не удаляет всю строку, как это подразумевается.Кто-нибудь знает, что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 25 марта 2011

РЕДАКТИРОВАТЬ Это оказалось медленнее, чем для цикла:

Альтернативой циклу с ручным кодированием может быть что-то вроде этого:

theArray.every(searchAndDestroy);

public function searchAndDestroy(element:*, index:int, arr:Array):Boolean
{
    if (element.userid == whoLeft)
    {
        arr.splice(index,1);
        return false;
    }
    return true;
}

Насколькокак я знаю, каждый () завершается в первый раз, когда тестовая функция возвращает false.Таким образом, вопрос заключается в следующем: для большого списка, который работает быстрее, цикл for или цикл, который Every () делает с накладными расходами вызова тестовой функции.

EDIT # 2 Ноэто было быстрее, чем цикл for для теста, который я выполнял на массиве из миллионов точек:

for each(var element:Object in theArray)
{
    if (element.userid==whoLeft)
    {
        theArray.splice(theArray.indexOf(element),1);
        break;
    }
}
2 голосов
/ 24 марта 2011

Вместо изменения исходного массива новый отфильтрованный массив возвращается методом filter. Поэтому вам нужно присвоить возвращаемый массив theArray.

Попробуйте это

theArray = theArray.filter(userLeaving);
1 голос
/ 25 марта 2011

Я думаю, это то, что вы ищете:

for(var i:uint = 0, len:uint = theArray.length; i<len; i++)
{
   if(thisArray[i].id == whoLeft.id)
   {
      thisArray.splice(i, 1);
      break;
   }
}

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

...