10

我在这里有一个数组:

var myArr = [1, 1, 2, 5, 5, 7, 8, 9, 9];

现在我想删除重复的两个外观。所以想要的结果不是

var myArr = [1, 2, 5, 7, 8 ,9];

var myArr = [2, 7, 8];

基本上我知道如何删除重复项,但不是那种特殊的方式。这就是为什么任何帮助将不胜感激!

请注意:我的数组充满了字符串。这里的数字仅用作示例。

4

9 回答 9

2

无论在何处涉及删除重复项,使用set data structure都不是一个坏主意。

JavaScript 没有原生的集合实现,但对象的键也可以工作——在这种情况下很有帮助,因为这些值可以用来跟踪一个项目在数组中出现的频率:

function removeDuplicates(arr) {
    var counts = arr.reduce(function(counts, item) {
        counts[item] = (counts[item]||0)+1;
        return counts;
    }, {});
    return Object.keys(counts).reduce(function(arr, item) {
        if(counts[item] === 1) {
            arr.push(item);
        }
        return arr;
    }, []);
}

var myArr = [1, 1, 2, 5, 5, 7, 8, 9, 9];
removeDuplicates(myArr);

查看 jsfiddle 上的示例

或者,您不能使用对 的调用reduce(),而是使用forfor(item in counts)循环:

function removeDuplicates(arr) {
    var counts = {};
    for(var i=0; i<arr.length; i++) {
        var item = arr[i];
        counts[item] = (counts[item]||0)+1;
    }
    var arr = [];
    for(item in counts) {
        if(counts[item] === 1) {
            arr.push(item);
        }
    }
    return arr;
}

查看 jsfiddle 上的示例

于 2012-07-13T16:34:07.540 回答
1

编辑有更好的答案:

var myArr = [1, 1, 2, 5, 5, 7, 8, 9, 9];

function removeDuplicates(arr) {
    var i, tmp;
    for(i=0; i<arr.length; i++) {
        tmp = arr.lastIndexOf(arr[i]);
        if(tmp === i) {
            //Only one of this number
        } else {
            //More than one
            arr.splice(tmp, 1);
            arr.splice(i, 1);
        }
    }
}
于 2012-07-13T16:32:26.700 回答
1

此代码的jsfiddle

var myArr = [1, 1, 2, 5, 5, 7, 8, 9, 9];
var newArr = myArr;
var h,i,j;


for(h = 0; h < myArr.length; h++) {
    var curItem = myArr[h];
    var foundCount = 0;
    // search array for item
    for(i = 0; i < myArr.length; i++) {
        if (myArr[i] == myArr[h])
            foundCount++;
    }
    if(foundCount > 1) {
        // remove repeated item from new array
        for(j = 0; j < newArr.length; j++) {
            if(newArr[j] == curItem) {                
                newArr.splice(j, 1);
                j--;
            }
        }            
    }
}
于 2012-07-13T16:34:02.053 回答
1

这是我的版本

var a = [1, 1, 2, 5, 5, 7, 8, 9, 9];

function removeIfduplicate( arr ) {
    var discarded = [];
    var good      = [];
    var test;
    while( test = arr.pop() ) {
        if( arr.indexOf( test ) > -1 ) {
            discarded.push( test );
            continue;
        } else if( discarded.indexOf( test ) == -1 ) {
            good.push( test );
        }
    }
    return good.reverse();
}

x = removeIfduplicate( a );
console.log( x ); //[2, 7, 8]
于 2012-07-13T16:35:28.807 回答
0

如果它只是字母数字,重复项区分大小写,并且任何元素不能超过两个,那么这样的事情可以工作:

var a = [2, 1, "a", 3, 2, "A", "b", 5, 6, 6, "B", "a"],

    clean_array = $.map(a.sort(), function (v,i) {
        a[i] === a[i+1] && (a[i] = a[i+1] = null);
        return a[i];
    });

// clean_array = [1,3,5,"A","B","b"]
于 2012-07-13T16:43:29.930 回答
0

在这个例子中,我们将两个数组作为函数参数,从这里我们将只打印两个数组的唯一值,从而删除两个数组中存在的值。

首先,我将两个数组连接成一个。然后我一次取每个数组值并循环遍历数组本身以寻找它的出现次数。如果没有出现(即计数)等于 1,那么我们将该元素推入结果数组。然后我们可以返回结果数组。

function diffArray(arr1, arr2) {
  var newArr = [];
  var myArr=arr1.concat(arr2);
  var count=0;
  for(i=0;i<myArr.length;i++){
    for(j=0;j<myArr.length;j++){
      if(myArr[j]==myArr[i]){
        count++;
      }
    }
    if(count==1){
      newArr.push(myArr[i]);
    }
    count=0;
  }
  return newArr;
}
于 2017-04-13T14:20:03.427 回答
0

这是一个使用Array.filter(). 诀窍是首先找到所有不唯一的值,然后使用此数组拒绝原始数组中的所有唯一项。

let myArr = [1, 1, 2, 5, 5, 7, 8, 9, 9];
let duplicateValues = myArr.filter((item, indx, s) => s.indexOf(item) !== indx);
myArr.filter(item => !duplicateValues.includes(item));
// => [2, 7, 8]



(如果你对解释感兴趣)

// this statement removes all dupicate values
myArr.filter((item, indx, s) => s.indexOf(item) === indx)

// by changing === to !== we do the "opposite", which means that we remove
// all items that are unique
myArr.filter((item, indx, s) => s.indexOf(item) !== indx)

于 2020-11-11T14:37:11.423 回答
-1

编辑:这是 jspref http://jsperf.com/deleting-both-values-from-array

http://jsfiddle.net/3u7FK/1/

这是在两遍中完成它的最快方法,无需使用任何花哨的技巧并保持灵活性。您首先旋转并找到每次出现的计数并将其放入键值对中。然后再次旋转并过滤掉计数大于 1 的过滤器。这也具有能够应用其他过滤器的优点,而不仅仅是“大于 1”;以及如果您还需要其他事情的话,还可以计算发生次数。

这也适用于字符串而不是数字。

http://jsfiddle.net/mvBY4/1/

var myArr = [1, 1, 2, 5, 5, 7, 8, 9, 9];
var map = new Object();

for(var i = 0; i < myArr.length; i++)
{
    if(map[myArr[i]] === undefined)
    {
        map[myArr[i]] = 1;
    }
    else
    {
        map[myArr[i]]++;
    }
}

var result = new Array();

for(var i = 0; i < myArr.length; i++)
{   
    if(map[myArr[i]] > 1)
    {
        //do nothing
    }
    else
    {
        result.push(myArr[i]);
    }

}

alert(result);
于 2012-07-13T16:59:15.117 回答
-1

您可以使用 Set(在 IE 11+ 中可用)如下

const sourceArray = [1, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8];
const duplicatesRemoved = new Set();

sourceArray.forEach(element => {
    if (duplicatesRemoved.has(element)) {
        duplicatesRemoved.delete(element)
    } else {
        duplicatesRemoved.add(element)
    }
})

console.log(Array.from(duplicatesRemoved))

旧版浏览器不支持NB箭头功能。请改用普通函数语法。但是,Array.from可以很容易地为旧版浏览器填充。

在这里试试

于 2019-01-25T14:20:46.587 回答