删除数字数组中的所有重复数字

时间:2019-03-20 07:09:49

标签: javascript arrays duplicates

我收到了这个问题进行练习,措词使我感到困惑,因为我看到它可能想要2个结果。

无论哪种方式,我都希望看到两种解决方案。

例如,如果我有一个数组:

let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];

我认为这是想要获得最终结果的原因之一:

let finalResult = [1, 2, 3, 4, 5, 8, 9, 10];

OR:

let finalResult = [1, 9, 10];

两者之间的区别在于,一个只是删除所有重复的数字,其余部分留下,第二个只是想要任何非重复的数字。

无论哪种方式,我都想编写两个功能,每个功能之一。

这是别人给的,这是我的第二个解决方案。

let elems = {},

arr2 = arr.filter(function (e) {
   if (elems[e] === undefined) {
       elems[e] = true;
    return true;
  }
  return false;
});
console.log(arr2);

我不确定第一个功能(删除所有重复项)。

9 个答案:

答案 0 :(得分:21)

使用SetArray.from()

let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];

console.log(Array.from(new Set(arr)));

替代使用正则表达式

正则表达式说明here

let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];

let res = arr
  .join(',')
  .replace(/(\b,\w+\b)(?=.*\1)/ig, '')
  .split(',')
  .map(Number);

console.log(res);

替代使用对象

let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];

let obj = arr.reduce((acc, val) => Object.assign(acc, {
  [val]: val
}), {});

console.log(Object.values(obj));

答案 1 :(得分:13)

只需使用简单的array.filter单线:

let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];
let finalResult = arr.filter((e, i, a) => a.indexOf(e) == i).sort(function(a, b){return a - b});
console.log(finalResult);

如果需要第二个结果,则可以使用另一个filter语句:

let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];
let finalResult = arr.filter((e, i, a) => a.filter(f => f == e).length == 1).sort(function(a, b){return a - b});
console.log(finalResult);

答案 2 :(得分:11)

对于第一部分,您可以使用Set()和“传播语法”来删除重复项。

let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];
let res = [...new Set(arr)]
console.log(res)

对于第二部分,您可以使用reduce()

let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];
//to get the object with count of each number in array.
let obj = arr.reduce((ac,a) => {
  //check if number doesnot occur before then set its count to 1
  if(!ac[a]) ac[a] = 1;
  //if number is already in object increase its count
  else ac[a]++;
  return ac;
},{})
//Using reduce on all the keys of object means all numbers.
let res = Object.keys(obj).reduce((ac,a) => {
  //check if count of current number 'a' is `1` in the above object then add it into array
  if(obj[a] === 1) ac.push(+a)
  return ac;
},[])
console.log(res)

答案 3 :(得分:5)

您可以一次创建两个数组

let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];
let unique = new Set();
let repeated = Array.from(arr.reduce((acc, curr) => {
	acc.has(curr) ? unique.delete(curr) : acc.add(curr) && unique.add(curr);
	return acc;
}, new Set()));

console.log(Array.from(unique))
console.log(repeated)

答案 4 :(得分:5)

您可以使用Array.prototype.reduce()创建一个hash对象,其中keys是数组中的数字,而values将是其中重复出现的数字arr数组变量。.

然后使用Object.keys()

  • 删除所有重复的Object.keys(hash)
  • 删除所有重复项,但使用Array.prototype.filter()进行过滤以获取仅出现一次的数字

代码:

const arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];
const hash = arr.reduce((a, c) => (a[c] = (a[c] || 0) + 1, a), {});

// [1, 2, 3, 4, 5, 8, 9, 10];
const finalResultOne = Object.keys(hash);

// [1, 9, 10];
const finalResultTwo = Object.keys(hash).filter(k => hash[k] === 1);

console.log('finalResultOne:', ...finalResultOne);
console.log('finalResultTwo:', ...finalResultTwo);

答案 5 :(得分:4)

您可以使用closureMap

let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];

const build = ar => {
  const mapObj = ar.reduce((acc, e) => {
    acc.has(e) ? acc.set(e, true) : acc.set(e, false)
    return acc
  }, new Map())
  
  return function(hasDup = true) {
    if(hasDup) return [...mapObj.keys()]
    else return [...mapObj].filter(([key, val]) => !val).map(([k, v])=> k)
  }
}

const getArr = build(arr)

console.log(getArr())
console.log(getArr(false))

答案 6 :(得分:4)

您可以先对数组进行排序,然后通过仅检查一侧是否重复或对两侧进行过滤来过滤该数组。

var array = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10],
    result1,
    result2;

array.sort((a, b) => a - b);

result1 = array.filter((v, i, a) => a[i - 1] !== v);
result2 = array.filter((v, i, a) => a[i - 1] !== v && a[i + 1] !== v);

console.log(...result1);
console.log(...result2)

答案 7 :(得分:4)

正如许多其他人所说,第一个只是[...new Set(arr)]

对于第二个,只需滤除多次出现的那些:

const arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];

const count = (arr, e) => arr.filter(n => n == e).length

const unique = arr => arr.filter(e => count(arr, e) < 2)

console.log(unique(arr));

答案 8 :(得分:2)

var arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];
var map = {};
var finalResult = [];
for (var i = 0; i < arr.length; i++) {
  if (!map.hasOwnProperty(arr[i])) {
    map[arr[i]] = true;
    finalResult.push(arr[i]);
  }
}

//if you need it sorted otherwise it will be in order
finalResult.sort(function(a, b) {
  return a - b
});

console.log(finalResult);