我如何将一次出现的所有项目过滤到一个列表中,并将多次出现的所有项目过滤到另一个列表中?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何将一次出现的所有项目过滤到一个列表中,并将多次出现的所有项目过滤到另一个列表中?相关的知识,希望对你有一定的参考价值。
我目前正在从事一个项目,但是我坚持删除所有重复项。
我需要删除所有重复的名称并放入单独的文件中
这是我正在尝试实现的示例:所以我有一个数字数组(1,2,2,3,3,4,5),我想从数组中删除所有重复项,以得到(1,4,5)。
用于循环数组,并将每个值放入哈希映射,该映射跟踪记录该数字的次数。然后循环遍历您的哈希映射,并创建一个仅包含记录为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);
有很多方法可以删除数组中的重复项。这是一些示例。
使用Set()
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]
根据您提供的输入:[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]]++;
elsemap[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];
以上是关于我如何将一次出现的所有项目过滤到一个列表中,并将多次出现的所有项目过滤到另一个列表中?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Angular 2中选择ngFor中的所有过滤复选框?