如何将出现一次的所有项目筛选到一个列表中,并将多次出现的所有项目筛选到另一个列表中?



我目前正在做一个项目,但我坚持删除所有重复项。

我需要删除所有重复的名称并放入一个单独的文件中

这是我试图实现的一个例子: 所以我有一个数字数组 (1,2,2,3,3,4,5(,我想从数组中删除所有重复项以产生 (1,4,5(。

For 循环数组并将每个值放入跟踪该数字记录次数的哈希映射中。然后遍历哈希映射并创建一个新数组,其中仅包含记录为 1 的值。

const arr = [1, 2, 2, 3, 3, 4, 5];
function removeDuplicates(arr) {
var hashMap = {};
for(let i of arr) {
if(hashMap[i]){
hashMap[i] += 1
} else {
hashMap[i] = 1
}
}
var newArray = [];
for(let [key, value] of Object.entries(hashMap)){
if(value === 1) {
newArray.push(parseInt(key));
} else {
// If you want to do something with values recorded more
// than once, you can do that here.
}
}
return newArray;
}

不使用任何外部库 - 我相信有更简洁的方法可以做到这一点,但这应该有效:

var numbers = [1, 2, 2, 3, 3, 4, 5];
function removeDuplicates(array) {
var existingValues = [];   // Holds all values that exist at least once
var duplicates = [];       // Holds all values that are duplicates
array.forEach(function(num) {
if (existingValues.indexOf(num) === -1) {
existingValues.push(num);
} else {
duplicates.push(num);
}
});
// Filter out the values from existingValues that are in the duplicates array
return existingValues.filter(function(i) {
return duplicates.indexOf(i) === -1;
});
}
console.log(removeDuplicates(numbers)); // [1,4,5]
数组

总是被排序吗?

不,但这可能是需要考虑的事情@Thomas

好的,这将允许这样的事情:

只需查看邻居以确定值是单个值还是多次出现。

const array = [1,2,2,3,3,4,5];
const single = [];
const multiple = [];
for (let i = 0, length = array.length; i < length; ++i) {
let value = array[i];
const isDupe = i > 0 && value === array[i - 1]
|| i + 1 < length && value === array[i + 1];
if (isDupe) {
multiple.push(value);
} else {
single.push(value);
}
}
console.log("singles", single);
console.log("multiple", multiple);

如果数据不能保证排序,我们需要先进行计数传递,检查哪些项目在该数组中是唯一的,哪些项目不是。在第二轮传递中,我们可以将它们添加到结果数组中。

const array = [3, 2, 4, 2, 5, 1, 3];
const single = [];
const multiple = [];
const count = {};
for (let i = 0; i<array.length; ++i) {
let value = array[i];
count[value] = (count[value] || 0) + 1;
}
for (let i = 0; i<array.length; ++i) {
let value = array[i];
if (count[value] > 1) {
multiple.push(value);
} else {
single.push(value);
}
}
console.log("singles", single);
console.log("multiple", multiple);

基于您给出的输入:[1, 2, 2, 3, 3, 4,5] 以及您说您想要两个输出的事实:一个具有唯一值 [1,4,5],另一个具有重复项 [2,2,3,3]。

下面的函数将为您提供两个数组作为输出,一个具有唯一值,另一个具有重复项。

const getUniqueAndDuplicates = (arr) =>{
//use a JavaScript object as a map to count frequency
const map={};
for(let i=0;i<arr.length;i++){
if(map[arr[i]]){map[arr[i]]++;}
else{map[arr[i]]=1;}
}
const uniqueArray=[];
const duplicateArray=[];

for(let key in map){
//get the frequency count
let freq=map[key];
if(freq===1){uniqueArray.push(key);}
else{
for(let i=0;i<freq;i++){
duplicateArray.push(key);
}
}
}
return [uniqueArray,duplicateArray];
}

有很多方法可以删除数组中的重复项。下面是一些示例。

使用 set((

集合

对象是值的集合。您可以循环访问 元素,按广告顺序排列。集合中的值只能 发生一次

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

const duplicated = [1,2,3,2,3,4,3,5];
const uniqSet = new Set(duplicated);
console.log([...uniqSet]) // Should be [1, 2, 3, 4, 5]

使用 lodash uniq(( 方法

文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

const _ = require('lodash');
const duplicated = [1,2,3,2,3,4,3,5];
const uniq = _.uniq(duplicated);
console.log(uniq) // Should be [1, 2, 3, 4, 5]

const duplicated = [1,2,3,2,3,4,3,5];
const uniq = [];
for (const e of duplicated) {
if (!uniq.includes(e)) {
uniq.push(e)
}
}
console.log(uniq) // Should be [1,2,3,4,5]

最新更新