jQuery清理两个字符串(比较string1到string2并删除不是uniq的项)

时间:2010-04-13 21:48:34

标签: jquery

如何从newItems字符串中删除oldItems? (删除蓝色和绿色)newItems是从jQuery自动完成生成的,我想从选择列表中删除已经选择的项目。

newItems = Blue \n Red \n Black \n Yellow \n Green \n
oldItems = Blue,Yellow,Orange,Green

祝你好运。 AsbjørnMorell。

1 个答案:

答案 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)。