Javascript - 从数组中删除唯一元素

时间:2016-09-20 16:12:25

标签: javascript arrays

我想知道如何从数组中删除唯一元素。例如:

var arr = [1, 2, 2, 4, 4]会返回[2, 2, 4, 4][1, 2, 3]将返回[]的位置,因为所有元素都是唯一的。

我相信我需要检查每个元素与数组中的其他每个元素,但我不知道如何解决这个问题。

谢谢!

8 个答案:

答案 0 :(得分:4)

使用ES6,您可以使用Array#map并使用Array#forEach计算值。

稍后使用Array#filter并检查计数。

如果大于1返回true(包括结果集中的项目),否则返回false(不包括结果集中的项目)。



function getNotUnique(array) {
    var map = new Map();
    array.forEach(a => map.set(a, (map.get(a) || 0) + 1));
    return array.filter(a => map.get(a) > 1);
}

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




答案 1 :(得分:1)

以下是从数组中删除唯一元素的基本知识和易于理解的内容。



function removeUnique(arr) {
	var newArr = [];
	for (var i = 0; i < arr.length; i++) {
		var count = 0;
		for (var j = 0; j < arr.length; j++) {
			if (arr[j] == arr[i]) {
				count++;
			}
		}
		if (count >= 2) {
			newArr.push(arr[i]);
		}
	}
    return newArr;
}
console.log(removeUnique([1, 2, 2, 4, 4]));
&#13;
&#13;
&#13;

答案 2 :(得分:1)

这应该这样做;

var arr = [1, 2, 2, 4, 4],
    unq = arr.map((e,i,a) => a.filter(f => f === e ).length)
             .reduce((p,c,i) => c === 1 ? p : p.concat(arr[i]) ,[]);
console.log(unq);

然而,在第二个想法中,以下可能更具可读性和效率。事实上,我们正在使用一种罕见的情况,我们可以通过短路来利用JS中的懒惰。

var r = [1,2,2,4,4].filter((e,i,a) => a.lastIndexOf(e) != i || a.indexOf(e) != i);
console.log(r);

因此a.indexOf(e) != i部分仅针对唯一元素和最后遇到的非唯一元素运行。凉。

答案 3 :(得分:1)

下面的代码返回所有重复的值

const getDuplicatedVals = (data) => data.filter( (x) => data.indexOf(x) != data.lastIndexOf(x))

答案 4 :(得分:0)

这是一个实现(使用https://stackoverflow.com/a/5668029/4202031

function removeUnique(arr) {
  var counts = {}

  for(var i = 0; i< arr.length; i++) {
      var num = arr[i]
      counts[num] = counts[num] ? counts[num]+1 : 1
  }

  var result = []
  for(var key in counts) {
    if(Object.prototype.hasOwnProperty.call(counts, key) && counts[key] > 1 {
      result.push(key)
    }
  }

  return result
}


var arr = [1, 2, 3]
var arr2 = [1, 1, 2, 2, 4, 6, 4]

console.log(removeUnique(arr)) // []
console.log(removeUnique(arr2)) // [ '1', '2', '4' ]

答案 5 :(得分:0)

可以做这样的事情(严格使用数组):

var arr = [1,2,3,4,4];
var temp = [];
var to_keep = [];
for(var x = 0; x < arr.length; x++){
  if(temp.indexOf(arr[x]) > -1) {
    if(to_keep.indexOf(arr[x]) == -1)
      to_keep.push(arr[x]);
  } else if(temp.indexOf(arr[x]) == -1) temp.push(arr[x]);
}

for(var y = 0; y < arr.length; y++){
  if(to_keep.indexOf(arr[y]) == -1){
    arr.splice(y,1);
    y--;
  }
}

// arr = [4,4];

答案 6 :(得分:0)

遍历数组,使用该值作为对象的索引,并对原始中的每个匹配项进行递增。然后迭代对象并拉出总数大于1的对象。应该适用于字符串和数字类型。

function dupsOnly(a) {
    var T = {};
    for (var i = 0; i < a.length; i++) {
        if (a[i] in T)
            T[a[i]] += 1;
        else
            T[a[i]] = 1;
    }
    var D = [];
    for (var t in T) {
        if (T[t] > 1)
            D.push(t);
        while (T[t] > 1) {
            T[t] -= 1;
            D.push(t);
       }
    }
    return D;
}

答案 7 :(得分:0)

var arr = [1, 2, 2, 4, 4]

var dict_with_count = {}
for (var i=0; i<arr.length; i++){
   dict_with_count[arr[i]] = 0
}

for (var i=0; i<arr.length; i++){
   dict_with_count[arr[i]] += 1
}

var new_list = [];

for (key in dict_with_count){
   if (dict_with_count[key] > 1){
       for (var j=0; j<dict_with_count[key]; j++){
          new_list.push(key)
       }
   }
}

console.log(new_list)