【问题标题】:How to compare two arraycollection如何比较两个数组集合
【发布时间】:2012-07-23 21:30:53
【问题描述】:

我用 (arA) 填充数据网格。 这个arraycollection 是一个httpService 的resultEvent。 数组集合 由于我的数据网格必须是最新的,我使用计时器来查询数据库并查看是否存在新记录。 今天,每次查询时,我都会刷新数据网格。 但是,这种定位不利于用户体验。

所以,我有了一个新想法,将更新 httpservice 的结果存储在一个新的 arraycollection (ArB) 中并比较两个 arraycollection。但我不知道该怎么做。

可以,你帮助我或寻求更好的解决方案。

谢谢

【问题讨论】:

  • 您在寻找新项目、已删除项目或其他内容吗?您必须编写自己的算法来比较数据集。您也可以考虑创建一个只返回更新的新远程调用。
  • 比较和使用Arrays比使用arrayCollection更好,可以使用Array()的source属性获取base array,并更新dataGrid dataprovider的source属性。

标签: actionscript-3 apache-flex


【解决方案1】:

使用 Flex,您可能想尝试mx.utils.ObjectUtil 进行比较。

public function compare(arrayCollection1:ArrayCollection, arrayCollection2:ArrayCollection):Boolean
{
    if (arrayCollection1.length != arrayCollection2.length)
        return false;

    for (var i:uint = 0; i < arrayCollection1.length; i++)
    {
        if (ObjectUtil.compare(arrayCollection1[i], arrayCollection2[i]) != 0)
            return false;
    }

    return true;
}

这是计算密集型的;因此,您可能需要考虑更改您的方法以包含上次接收数据时的时间戳或索引。在您的 Web 服务中,该时间戳可以作为参数传递。然后,您的 Web 服务将更精简,仅返回上次调用的增量。

【讨论】:

    【解决方案2】:

    在我看来,你可以尝试这样的方法:

    1- 存储在数据库中的数据会有字段updateDate,这是该字段的最新更新时间。

    2-每次查询新/更新/删除项目时,只需加载更新项目。 (使用这种方法,已删除的项目不会真正从系统中删除,只需将其标志更新为已删除)。

    3- 比较更新后的数组与当前数组时,只需比较当前数组中对象的 id 与更新后数组中对象的 id,并相应更新即可。

    这种方法类似于上面 www.Flextras.com 的评论。

    【讨论】:

      【解决方案3】:

      我会提出这个建议:

      • 使用数组作为缓冲区。

      • 将缓冲区大小设置为合理的大小。说 10 条记录。

      • 在缓冲区已满或您指定的瞬间填充网格 - 以之前的为准。

      【讨论】:

        【解决方案4】:

        我建议您可以通过以下方式进行:

        #1

        每条记录都有自己的id,所以可以根据id字段比较本地arraycollection和远程arraycollection,然后将新记录添加到本地arraycollection中。

        #2

        在服务器中添加新的 api 以支持带 id 的分页。

        例如:

        getRecord(fromid,-1) 会将记录从“from id”返回到最新记录。 getRecord(fromid,toid) 将返回记录 from 和 to。

        【讨论】:

          【解决方案5】:

          我会考虑在响应中有一个带有时间戳的 last_modify 字段,因此您可以检查响应的长度,即响应的 last_modify 字段是否大于之前的 last_modify 是因为发生了变化在数据中,但您需要后端的帮助才能进行此更改

          【讨论】:

            【解决方案6】:

            如果两个数组集合长度相同:

            public function foo(coll1:ArrayCollection, coll2:ArrayCollection):void 
            {
                if (coll1.length == coll2.length) 
                {
                    for (var i:int = 0; i < coll1.length; i++) 
                    {
                        if (coll1[i].first != coll2[i].first || coll1[i].last != coll2[i].last) 
                        {
                            Alert.show("Different");
                            return;
                        }
                   }
                }
            
               Alert.show("Same");
            } 
            

            【讨论】:

            • 这不是一个解决方案。 coll1[i] 是集合中的一项,并且是 Object 类型。默认情况下没有像 first 和 last 这样的属性。这就是表达式 coll1[i].first 给出“未定义”结果的原因。如果我错了,请告诉我。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-20
            • 1970-01-01
            • 1970-01-01
            • 2021-12-18
            • 1970-01-01
            相关资源
            最近更新 更多