JavaScript数组去除相邻重复字符串

4

我有一个数组,例如:

var arr = ['ab', 'cd', 'cd', 'ef', 'cd'];

现在我想要移除相邻的重复项,在这个例子中,它们在索引1和2处(cd)。
结果必须是:
var arr = ['ab', 'cd', 'ef', 'cd'];

我尝试了这段代码,但它没有起作用:
var uniqueNames = [];
$.each(arr, function(i, el){
    if($.inArray(el, uniqueNames) === -1) uniqueNames.push(el);
});

但是这个过滤器会去重,而我不想要这个功能。


['ab', 'cd', 'cd', 'cd', 'ef', 'cd']的情况会怎么样? - Redu
6个回答

6
您可以检查后继者并过滤数组。

var array = ['ab', 'cd', 'cd', 'ef', 'cd'],
    result = array.filter((a, i, aa) => a !== aa[i + 1]);
    
console.log(result);


2
let uniqueNames = [];
let arr = ['ab', 'cd', 'cd', 'ef', 'cd'];

arr.forEach((element) => {
   if(element !== uniqueNames.slice(-1).pop()) {
      uniqueNames.push(element);
   }
});

2

其中一种做法

var arr = ['ab', 'cd', 'cd', 'ef', 'cd'];
var uniqueNames = [];
$.each(arr, function(i, el){
    if(el != uniqueNames[i-1]) uniqueNames.push(el);
});
console.log(uniqueNames);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


2
一个简单的反向循环 - 剪切邻近的重复项。适用于您不介意改变原始数组的情况。当使用 splice 时,数组的长度显然会减少,这就是为什么从数组末尾开始工作更容易的原因。

let arr = ['ab', 'cd', 'cd', 'ef', 'cd'];

for (let i = arr.length - 1; i >= 0; i--) {
  if (arr[i-1] === arr[i]) arr.splice(i, 1);
}

console.log(arr);


2

只需迭代数组,跟踪最后一个元素即可。

var data = ["ab", "cd", "cd", "ef", "cd"];
var result = [data[0]];
var last = data[0];
for (var i = 1, len = data.length; i < len; i++) {
  if (data[i] !== last) {
    result.push(data[i]);
    last = data[i];
  }
}
console.log(result);


1

使用简短的String.replace()方法,附带扩展示例:

var arr = ['ab', 'cd', 'cd', 'cd', 'ef', 'ef', 'cd', 'cd'],
    result = arr.join(',').replace(/(\S+)(,\1)+/g, '$1').split(',');
 
console.log(result);


@JamesThorpe,所有额外的情况都应该事先提到。它适用于当前输入。分隔符可以更改,这不是问题。 - RomanPerekhrest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接