从阵列中仅删除一个重复项

时间:2018-11-19 10:32:39

标签: javascript

我试图仅从数组中删除2之一,但是我的代码删除了所有这些。我的代码如下:

var arr = [2,7,9,5,2]
arr.filter(item => ((item !== 2)));

和:

var arr = [2,7,9,2,2,5,2]
arr.filter(item => ((item !== 2)));

两个都删除。我考虑过删除重复项,如果只有一个重复项,则可以删除重复项-例如:

Array.from(new Set([2,7,9,5,2]));
function uniq(a) {
 return Array.from(new Set(a)) 
}

但是如果有多个重复项会失败,因为它会删除所有重复项,包括任何其他重复的数字:

Array.from(new Set([2,7,9,9,2,2,5,2]));
function uniq(a) {
 return Array.from(new Set(a)) 
}

有人知道如何只删除2个之一吗?感谢您的帮助。

6 个答案:

答案 0 :(得分:3)

您可以将indexOf方法与splice结合使用。

var arr = [2,7,9,5,2]
var idx = arr.indexOf(2)
if (idx >= 0) {
    arr.splice(idx, 1);
}
console.log(arr);

答案 1 :(得分:2)

您可以使用计数器关闭并仅删除第一个2

var array = [2, 7, 9, 2, 3, 2, 5, 2],
    result = array.filter((i => v => v !== 2 || --i)(1));
    
console.log(result);

对于其他2,您可以调整递减的起始值。

var array = [2, 7, 9, 2, 3, 2, 5, 2],
    result = array.filter((i => v => v !== 2 || --i)(2));
    
console.log(result);

答案 2 :(得分:1)

有多种方法可以做到这一点;一种相对简单的方法是使用indexOf;看到另一篇文章:https://stackoverflow.com/a/5767357/679240

var array = [2, 7, 9, 5, 2];
console.log(array)
var index = array.indexOf(2);
if (index > -1) {
  array.splice(index, 1);
}
// array = [7, 9, 5, 2]
console.log(array);

答案 3 :(得分:1)

您可以这样做:

const arr = [2, 7, 9, 2, 2, 5, 2];
const result = arr
  .reduce((a, c) => {
    a.temp[c] = ++a.temp[c] || 1;
    if (a.temp[c] !== 2) {
      a.array.push(c);
    }
    return a;
  }, {temp: {}, array: []})
  .array;

console.log(result);

答案 4 :(得分:1)

您可以按照以下方法

var arr= [2,3,4,2,4,5];
var unique = [];
$.each(arr, function(i, el){
    if($.inArray(el, unique) === -1) unique.push(el);
})

答案 5 :(得分:1)

从数组中过滤所有重复项的最简单方法:

arr.filter((item, position) => arr.indexOf(item) === position)

如果另一个具有相同值的元素已经存在,则此方法跳过元素。

如果您只需要过滤第一个重复项,则可以使用其他bool键:

arr.filter((item, position) => {
  if (!already && arr.indexOf(item) !== position) {
    already = true
    return false
  } else return true
})

但是此方法开销很大。最聪明的方法是使用for循环:

for (let i = 0; i < arr.length; i++) {
  if (arr.indexOf(arr[i]) !== i) {
    arr.splice(i,1);
    break;
  }
}