Remove all of the duplicate numbers in an array of numbers
本问题已经有最佳答案,请猛点这里访问。
我收到这个问题是为了练习,措辞让我困惑,因为我看到了2个可能需要的结果。
不管怎样,我都想看看这两种解决方案。
例如,如果我有一个数组:
1 | let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10]; |
我将此视为希望最终结果:
1 | let finalResult = [1, 2, 3, 4, 5, 8, 9, 10]; |
或:
1 | let finalResult = [1, 9, 10]; |
两者之间的区别是,一个删除任何重复的数字,剩下的留下,第二个只需要任何不重复的数字。
不管怎样,我想写两个函数,每个函数执行一个。
这是别人给我的第二个解决方案。
1 2 3 4 5 6 7 8 9 10 | let elems = {}, arr2 = arr.filter(function (e) { if (elems[e] === undefined) { elems[e] = true; return true; } return false; }); console.log(arr2); |
我不确定第一个函数的功能(删除所有重复项)。
使用set和array.from()。
1 2 3 | let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10]; console.log(Array.from(new Set(arr))); |
交替使用regex
此处显示regex说明
1 2 3 4 5 6 7 8 9 | 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); |
交替使用对象
1 2 3 4 5 6 7 | 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 2 3 | 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); |
如果需要第二个结果,可以使用另一个
1 2 3 | 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); |
对于第一部分,可以使用
1 2 3 | let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10]; let res = [...new Set(arr)] console.log(res) |
第二部分可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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) |
您可以使用array.prototype.reduce()创建一个
然后使用object.keys():
- 删除所有重复的
Object.keys(hash) 。 - 删除所有重复项,但使用array.prototype.filter()进行筛选,以获取仅出现一次的数字
代码:
1 2 3 4 5 6 7 8 9 10 11 | 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); |
您可以一次创建两个数组
1 2 3 4 5 6 7 8 9 | 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) |
正如许多其他人所说,第一个只是
对于第二种情况,只需过滤掉那些多次出现的情况:
1 2 3 4 5 6 7 | 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)); |
您可以对前面的数组进行排序,并通过只检查一侧是否重复或两侧来筛选数组。
1 2 3 4 5 6 7 8 9 10 11 | 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) |
您可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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); |