我有一个包含两个列表的网页。由搜索填充的源列表(由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);
}
}
}
答案 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)。