如何从newItems字符串中删除oldItems? (删除蓝色和绿色)newItems是从jQuery自动完成生成的,我想从选择列表中删除已经选择的项目。
newItems = Blue \n Red \n Black \n Yellow \n Green \n
oldItems = Blue,Yellow,Orange,Green
祝你好运。 AsbjørnMorell。
答案 0 :(得分:2)
一种算法是查看每个oldItem并在newItems数组中搜索它们。但是,如果您希望这些数组达到任意长度,那么这将是O(n^2)
。这基本上是Jacob Relkin给出的算法。
但是,如果您对两个列表进行排序,则可以更快地完成。
var newArray = newItems.split("\n").sort();
var oldArray = oldItems.split(",").sort();
var newUniq = [];
var newLength = newArray.length;
var oldLength = oldArray.length;
var oldI = 0;
var newI = 0;
while (newI < newLength && oldI < oldLength) {
var oldString = oldArray[oldI].trim();
var newString = newArray[newI].trim();
if (oldString == "") {
oldI++;
} else if (newString == "") {
newI++;
} else if (oldString == newString) {
/* We only update newI, because if there are multiple copies of the
* same string in newItems, we want to ignore them all. */
newI++;
} else if (oldString < newString) {
oldI++;
} else { /* newArray[newI] < oldArray[oldI] */
newUniq.push(newArray[newI]);
newI++;
}
}
while (newI < newLength) {
newUniq.push(newArray[newI]);
newI++;
}
newItems = newUniq.join(" \n ");
这将遍历两个列表,在旧列表的新列表中查找重复项。由于两个排序操作,这应该是O(n log n)。