这感觉效率低吗?

时间:2011-09-09 17:19:12

标签: javascript

我有一个包含两个列表的网页。由搜索填充的源列表(由availableThings表示)以及用户已选择的项(selectedThings)。我想维护一个唯一的selectedThings列表,所以我想从可用的东西列表中删除已经选择的东西。在下面的代码段中,data.AvailableThings从服务器填充,不知道用户选择的内容。用户最多可以选择3个项目,ergo selectedThings.items将包含不超过3个项目。 availableThings.items可能有几千人。

填充availableThings.items后,我将其提供给ICanHaz以生成HTML。 FWIW,我在列表之间使用jQuery进行拖动行为,但问题是与jQuery无关。

[... jQuery AJAX call snipped ...]
success: function (data) {

    availableThings.items = [];

    for (var thing in data.AvailableThings) {
        var addToList = true;

        for (var existing in selectedThings.items) {
            if (existing.Id === thing.Id) {
                addToList = false;
                break;
            }
        }

        if (addToList) {
            availableThings.items.push(thing);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

如果n是可用事物的数量而m是所选事物的数量,那么这是O(n * m),而如果你用ID进行哈希,你可以把它变成O(n + m)。

var existingIds = {};

for (var existing in selectedThings.items) {
  existingIds[existing.Id] = existingIds;
}

availableThings.items = [];
for (var thing in data.AvailableThings) {
    if (existingIds[thing.Id] !== existingIds) {
        availableThings.items.push(thing);
    }
}

答案 1 :(得分:1)

如果对来自服务器的数据有某种顺序(按ID,名称或任何字段排序),您可以只对所选集合中的每个项目进行二进制搜索,如果存在,则删除它们。他们被发现了。对于允许选择m个项目的n个项目的数据集,这会将其减少到O(m log n)。既然你把它固定在3,它基本上就是O(log n)。