如何拼接数组中的重复项

5

我正在尝试使用JavaScript编写一个函数,接受一个包含重复项的数组,并返回删除重复项后的相同数组。我知道如何使用Set、filter和reduce来实现此功能,但我想尝试不使用这些函数来完成它。问题是,一旦找到重复项,我不知道如何从数组中切掉该重复项,那么如果发现重复项,如何将其从数组中删除呢?以下是我的代码:

function clearDuplicatesInArray(arr, item) {
 for(i = 0; i < arr.length; i++) {
   for(j = 0; j < arr.length; j++) {
      if(arr[i] === arr[j]) {
       arr.splice(arr[i], arr[j])
      }
    }
  }
 return arr;
}

clearDuplicatesInArray([1,1,2,3]);

2
可能是[获取JavaScript数组中所有唯一值(删除重复项)]的重复问题(https://dev59.com/PXI-5IYBdhLWcg3wO1rl)。 - Iurii Drozdov
1
这显然不是重复。 - Mahma Deva
请查看此链接以获取更多见解,希望能有所帮助:https://dev59.com/1W865IYBdhLWcg3wHKzu - Earl-V
@MahmaDeva 那个重复的问题有89个答案,其中许多只是使用for循环而没有使用任何数组方法。此外:在不中断for循环的情况下遍历数组并删除元素 - adiga
5个回答

5

您可以从末尾开始迭代,以防止对尚未访问的索引进行切片,并使用第二个循环直到外部索引,因为在此索引之上,您已经访问了项目。

对于拼接,请将索引和1作为参数,这将删除给定索引处的一个元素。

function clearDuplicatesInArray(array, item) {
    var i = array.length,
        j;
    
    while (--i) {
        for (j = 0; j < i; j++) {
            if (array[i] === array[j]) {
                array.splice(i, 1);
                break;
            }
        }
    }
    return array;
}

console.log(clearDuplicatesInArray([1, 1, 2, 3]));


1
我只是要修复你的代码,虽然有很多不同的方法可以得到解决方案。

function clearDuplicatesInArray(arr, item) {
 for(i = 0; i < arr.length; i++) {
   for(j = i+1; j < arr.length; j++) {
      if(arr[i] === arr[j]) {
       arr.splice(i, 1);
       i--;
       break;
      }
    }
  }
 return arr;
}

console.log(clearDuplicatesInArray([1,1,2,3]));


0

你可以使用值作为键,以O(n)的时间复杂度去除重复项。

function clearDuplicatesInArray(array,item){
    var temp = {};
    for(v of array){
        temp[v] = v
    }
    return Object.values(temp)
}
console.log(clearDuplicatesInArray([1,1,1,2,1,4,2,3]))


0
function removeDuplicates(array) {
   var tmp = array.slice(); //copy of array
   for(let i = 0, max = tmp.length; i < max; i++) {
      if(tmp.indexOf(tmp[i]) != tmp.lastIndexOf(tmp[i])) {
         tmp.splice(tmp.indexOf(tmp[i]), 1);
         i--;
      }
   }
   return tmp;
}

此函数检查值的第一个出现是否也是数组中的最后一个,如果不是,则将其删除。

请注意,它使用了两个不同的函数:slice 和 splice。

input:
removeDuplicates([1,1,2,3,4,4,7]);

output:
Array(5) [ 1, 2, 3, 4, 7 ]

0
另一种通过编写单个循环完成它的方法如下:
1)排序数组。
2)运行一个反向循环(以避免剪接问题)。
arr = arr.sort();

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

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