Javascript删除所有出现的重复元素,留下唯一的唯一元素

IT技术 javascript arrays
2021-02-24 08:47:04

我想删除多次出现的元素并获取唯一元素。数组总是有 3 个元素。假设我有一个数组 [2,3,2],然后我需要得到 3,它只在数组中是唯一的(删除两个 2,因为它们出现不止一次)。

我已尝试使用以下代码,但肯定无法按预期工作。

var firstArrTemp = [2,3,2];
var sorted_arr = firstArrTemp.sort();
var unique_element;
for (var i = 0; i < sorted_arr.length - 1; i++) {
    if (sorted_arr[i + 1] != sorted_arr[i]) {
        unique_element=sorted_arr[i];
    }
}

alert(unique_element);

谢谢!

6个回答

这应该可以解决问题:

Array.prototype.getUnique = function(){
    var uniques = [];
    for(var i = 0, l = this.length; i < l; ++i){
        if(this.lastIndexOf(this[i]) == this.indexOf(this[i])) {
            uniques.push(this[i]);
        }
    }
    return uniques;
}

// Usage:

var a = [2, 6, 7856, 24, 6, 24];
alert(JSON.stringify(a.getUnique()));

console.log(a.getUnique()); // [2, 7856]

要检查特定项在数组中是否唯一,它只检查它所在的第一个索引是否与它找到的最后一个索引匹配。

这对于小数组来说很好,但如果你的数组有大量元素,这可能会变得很慢。
2021-05-03 08:47:04
这就是确切的答案。谢谢,兄弟!
2021-05-07 08:47:04
我完全忘记了我在这里有答案。如果您知道更快的解决方案,请回答:-)
2021-05-17 08:47:04

使用 filter() 函数的一种替代方法:

var myArray = [1,2,3,2,2,4,3,7,3].sort();
var uniqueValues = myArray.filter(function(item, i, arr) {
  return (item !== arr[i-1] && item !== arr[i+1]);
});

其中uniqueValues= [1,4,7]

当然,这有效。但是,对数组进行排序然后再次对其进行迭代似乎是双重工作。
2021-04-30 08:47:04
我不确定我是否完全正确地创建了性能测试用例(至少我尝试过),但结果如下:jsperf.com/remove-uniques没有证明任何事情,但我没有看到先排序然后过滤真正的问题(或双重工作)。
2021-05-07 08:47:04

到目前为止,其他答案都具有O(n log n)时间复杂度或更糟。O(n)尽管使用集合(Set.has具有O(1)复杂性)而不是嵌套循环,但这可以及时完成

// .sort has complexity O(n log n): it's not needed here, avoid it
const getOnlyUniques = (arr) => {
  const foundOnce = new Set();
  const foundTwice = new Set();
  arr.forEach((item) => {
    if (foundOnce.has(item)) {
      foundTwice.add(item);
    }
    foundOnce.add(item);
  });
  return arr.filter(item => !foundTwice.has(item));
};
console.log(getOnlyUniques([2, 3, 2]));

在从数组中删除重复项时,我通常使用一种方法:

const arrWithDuplicates = [1,2,2,2,3,4,4]
const arrWithUniqueValues = [...new Set(arrWithDuplicates)]

// result will be: [1,2,3,4]

这也适用于字符串和布尔值。

请更清楚地说明什么是 Set
2021-04-27 08:47:04
“Set 对象允许您存储任何类型的唯一值,无论是原始值还是对象引用。” - MDN 文档。
2021-05-14 08:47:04
因此,它使您可以默认存储唯一值。
2021-05-15 08:47:04

替代:

var a = [2,3,2], result = [];

for(var i = 0; i < a.length; i++){

    if(getAllIndexes(a, a[i]).length === 1)
        result.push(a[i]);
}

console.log(result);

function getAllIndexes(arr, val) {
    var indexes = [], i = -1;
    while (~(i = arr.indexOf(val, i+1)))
        indexes.push(i);
    return indexes;
}
我不知道这里发生了什么 oO 你在数组上迭代两次吗?
2021-05-02 08:47:04
O(n)虽然使用 Sets 是可能的。(也可以用对象来完成,但集合更合适)
2021-05-11 08:47:04
@Cerbrus 嘿,我并没有说它是性能最好的解决方案 - 只是一个替代方案 ;) 虽然很难产生 < O(N^2) 的复杂性。
2021-05-19 08:47:04