javascript - 删除排序数组中的重复项

标签 javascript arrays duplicates duplicate-removal sorting

以防万一您错过了,问题是关于删除 sorted 数组上的重复项。这可以应用非常快速的算法(与未排序的数组相比)来删除重复项。

  • 如果您已经知道如何删除 SORTED 数组中的重复项,则可以跳过此部分

示例:

var out=[];
for(var i=0,len=arr.length-1;i<len;i++){
    if(arr[i]!==arr[i+1]){
        out.push(arr[i]);
    }
}
out.push(arr[i]);

看到了吗,它非常快。我将尝试解释刚刚发生的事情。

排序后的数组*可能如下所示:

arr=[0,1,1,2,2,3,4,5,5,6,7,7,8,9,9,9];

*排序可以是 ASC 或 DESC,或者其他奇怪的方法,但重要的是每个重复的项目都是相邻的。

我们在 array.length-1 处停止,因为我们没有任何要检查的内容

然后我们不顾一切地添加了最后一个元素,因为:

案例A:

... ,9,9,9];//我们在最后一个元素的左边有 dup(s)

情况 B:

... ,7,9,10];//最后一个元素的左边没有重复项

如果你真的了解发生了什么,你就会知道我们没有在案例 A 上添加任何 9。因此,无论是否添加,我们都想添加最后一个元素在案例 A 或 B 上。


问题:

这说明了,我想做同样的事情,但在以下情况下忽略 undefined 值:

var arr=[];arr[99]=1;//0 through 98 are undefined, but do NOT hold the undefined value

我想删除那些。如果我有一些真正的 undefined 值,则不应删除这些值。

我糟糕的尝试是这个:

var out=[];
for (var i=0,len=arr.length; i < len - 1;) {
  var x = false;
  var y = false;

  for (var j = i, jo; j < len - 1; j++) {
    if (j in arr) {
      x = true;
      jo = arr[j];
      i = j + 1;
      break;
    }
  }
  if (x == false) {
    break;
  }

  for (var u = i, yo; u < len - 1; u++) {
    if (u in arr) {
      y = true;
      yo = arr[u];
      i = u + 1;
      break;
    }
  }
  if (y == false) {
    out.push(jo);
    break;
  }

  if (jo !== yo) {
    out.push(jo);
  }
}
out.push(arr[len - 1]);

我真的迷路了,感谢任何帮助

最佳答案

使用 .filter() 的现代单行代码

arr.filter((e, i, a) => e !== a[i - 1]);

我对这里其他答案的复杂性感到非常惊讶,即使是那些使用 .filter()

即使使用没有箭头函数的老式 ES5 语法:

arr.filter(function (e, i, a) { return e !== a[i - 1] });

例子:

let a = [0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 9];

let b = arr.filter((e, i, a) => e !== a[i - 1]);

console.log(b); // [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

如果您需要就地改变数组,那么只需使用:

arr = arr.filter((e, i, a) => e !== a[i - 1]);

我个人建议不要使用此处其他答案中的复杂解决方案。

关于javascript - 删除排序数组中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9355403/

相关文章:

php - simpleXml 到数组的行为对我来说很奇怪,并且在 9941 项处中断

java - 如何从java中的两个数组中删除重复的字符串?

file - 查找文件中的重复行并计算每行重复的次数?

javascript - 将 HTML5 与 Angularjs、Node/Express 以及 MEAN.js 样板结合使用

javascript - 删除当前的 <tr> 并使用纯 JavaScript 删除其之前的 <tr>

javascript - 当包装在 <Grid> 中时,组件将失去对存储的访问权限(react-inline-grid)

用于打印卡片的 Java 多维数组

javascript - html的执行顺序

c++ - 字符串运算符+(重载)char数组和string.in cpp中的不同行为

php - MYSQL意外插入多行