如何根据元素的值删除数组中的“行”?

时间:2011-03-24 20:37:43

标签: arrays flash flex actionscript-3

这是我目前正在做/正在努力实现我的目标。但它并没有像我希望的那样删除“行”。

所以,我正在创建一个对象,然后将其推入一个数组中。添加到数组部分工作正常,就像我期望的那样。

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,然后在数组中查找该对象的userid部分中的特定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 个答案:

答案 0 :(得分:2)

filter方法返回新筛选的数组,而不是修改原始数组。因此,您需要将返回的数组分配给theArray

试试这个

theArray = theArray.filter(userLeaving);

答案 1 :(得分:2)

编辑结果比循环慢:

手动编码循环的替代方法可能是这样的:

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循环或每个()对测试函数调用的开销做的循环。

编辑#2 但是,对于我在一百万点阵列上运行的测试来说,这比for循环更快:

for each(var element:Object in theArray)
{
    if (element.userid==whoLeft)
    {
        theArray.splice(theArray.indexOf(element),1);
        break;
    }
}

答案 2 :(得分:1)

我认为这就是你要找的东西:

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

但是,你真的需要它在一个数组中,因为你总是可以使用一个字典,这意味着可以通过id访问它,这将更容易删除。