数组中有一个对象列表。每个对象都有一封电子邮件。
数组可能有重复的电子邮件,我想保留它们。
我想给出一个数字,比方说4,它应该把电子邮件分成4组,成一张地图,其中键就像组-1.在这个例子中,每个键中的值4是唯一的电子邮件,我将有一张5键的地图。
const emails=[{userId:'someuserid',email:'email1@gmail.com',password:'password1',recovery:'recovery1@gmail.com'},{userId:'someuserid',email:'email1@gmail.com',password:'password1',recovery:'recovery1@gmail.com'},{userId:'someuserid',email:'email10@gmail.com',password:'password10',recovery:'recovery10@gmail.com'},{userId:'someuserid',email:'email10@gmail.com',password:'password10',recovery:'recovery10@gmail.com'},{userId:'someuserid',email:'email2@gmail.com',password:'password2',recovery:'recovery2@gmail.com'},{userId:'someuserid',email:'email2@gmail.com',password:'password2',recovery:'recovery2@gmail.com'},{userId:'someuserid',email:'email3@gmail.com',password:'password3',recovery:'recovery3@gmail.com'},{userId:'someuserid',email:'email3@gmail.com',password:'password3',recovery:'recovery3@gmail.com'},{userId:'someuserid',email:'email4@gmail.com',password:'password4',recovery:'recovery4@gmail.com'},{userId:'someuserid',email:'email4@gmail.com',password:'password4',recovery:'recovery4@gmail.com'},{userId:'someuserid',email:'email5@gmail.com',password:'password5',recovery:'recovery5@gmail.com'},{userId:'someuserid',email:'email5@gmail.com',password:'password5',recovery:'recovery5@gmail.com'},{userId:'someuserid',email:'email6@gmail.com',password:'password6',recovery:'recovery6@gmail.com'},{userId:'someuserid',email:'email6@gmail.com',password:'password6',recovery:'recovery6@gmail.com'},{userId:'someuserid',email:'email7@gmail.com',password:'password7',recovery:'recovery7@gmail.com'},{userId:'someuserid',email:'email7@gmail.com',password:'password7',recovery:'recovery7@gmail.com'},{userId:'someuserid',email:'email8@gmail.com',password:'password8',recovery:'recovery8@gmail.com'},{userId:'someuserid',email:'email8@gmail.com',password:'password8',recovery:'recovery8@gmail.com'},{userId:'someuserid',email:'email9@gmail.com',password:'password9',recovery:'recovery9@gmail.com'},{userId:'someuserid',email:'email9@gmail.com',password:'password9',recovery:'recovery9@gmail.com'}]
const groupsMap = new Map()
let sequence = 0
let profilePrefix = 'none'
let pivotPrefix = 0
const prefix = 'group'
const bucketSize = 4
for (let index = 0; index < emails.length; index++) {
const currentEmail = emails[index]?.email
const prevEmail = emails[index - 1]?.email
if (prevEmail && currentEmail === prevEmail) {
if (
groupsMap.has(`${prefix}-${pivotPrefix}`) &&
groupsMap.get(`${prefix}-${pivotPrefix}`).length < bucketSize &&
groupsMap
.get(`${prefix}-${pivotPrefix}`)
.findIndex((email) => currentEmail === email.email) === -1
) {
groupsMap.get(`${prefix}-${pivotPrefix}`).push(emails[index])
if (
groupsMap.get(`${prefix}-${pivotPrefix}`).length === bucketSize
) {
pivotPrefix++
}
} else {
if (pivotPrefix > 0) {
const nextPivot = pivotPrefix++
groupsMap.get(`${prefix}-${nextPivot}`).push(emails[index])
}
sequence++
profilePrefix = `${prefix}-${sequence}`
groupsMap.set(profilePrefix, [emails[index]])
}
} else {
if (groupsMap.has(`${prefix}-${pivotPrefix}`)) {
if (
groupsMap.get(`${prefix}-${pivotPrefix}`).length < bucketSize
) {
groupsMap.get(`${prefix}-${pivotPrefix}`).push(emails[index])
if (
groupsMap.get(`${prefix}-${pivotPrefix}`).length ===
bucketSize
) {
pivotPrefix++
}
} else {
sequence++
groupsMap.set(`${prefix}-${sequence}`, [emails[index]])
}
} else {
sequence++
pivotPrefix = sequence
profilePrefix = `${prefix}-${pivotPrefix}`
groupsMap.set(profilePrefix, [emails[index]])
}
}
}
console.log(groupsMap)
// desired output below
Map(6) {
'group-0' => [
{
userId: 'someuserid',
email: 'email1@gmail.com',
password: 'password1',
recovery: 'recovery1@gmail.com'
},
{
userId: 'someuserid',
email: 'email10@gmail.com',
password: 'password10',
recovery: 'recovery10@gmail.com'
},
{
userId: 'someuserid',
email: 'email2@gmail.com',
password: 'password2',
recovery: 'recovery2@gmail.com'
},
{
userId: 'someuserid',
email: 'email3@gmail.com',
password: 'password3',
recovery: 'recovery3@gmail.com'
}
],
'group-1' => [
{
userId: 'someuserid',
email: 'email1@gmail.com',
password: 'password1',
recovery: 'recovery1@gmail.com'
},
{
userId: 'someuserid',
email: 'email10@gmail.com',
password: 'password10',
recovery: 'recovery10@gmail.com'
},
{
userId: 'someuserid',
email: 'email2@gmail.com',
password: 'password2',
recovery: 'recovery2@gmail.com'
},
{
userId: 'someuserid',
email: 'email3@gmail.com',
password: 'password3',
recovery: 'recovery3@gmail.com'
}
],
'group-2' => [
{
userId: 'someuserid',
email: 'email4@gmail.com',
password: 'password4',
recovery: 'recovery4@gmail.com'
},
{
userId: 'someuserid',
email: 'email5@gmail.com',
password: 'password5',
recovery: 'recovery5@gmail.com'
},
{
userId: 'someuserid',
email: 'email6@gmail.com',
password: 'password6',
recovery: 'recovery6@gmail.com'
},
{
userId: 'someuserid',
email: 'email7@gmail.com',
password: 'password7',
recovery: 'recovery7@gmail.com'
}
],
'group-3' => [
{
userId: 'someuserid',
email: 'email4@gmail.com',
password: 'password4',
recovery: 'recovery4@gmail.com'
},
{
userId: 'someuserid',
email: 'email5@gmail.com',
password: 'password5',
recovery: 'recovery5@gmail.com'
},
{
userId: 'someuserid',
email: 'email6@gmail.com',
password: 'password6',
recovery: 'recovery6@gmail.com'
},
{
userId: 'someuserid',
email: 'email7@gmail.com',
password: 'password7',
recovery: 'recovery7@gmail.com'
}
],
'group-4' => [
{
userId: 'someuserid',
email: 'email8@gmail.com',
password: 'password8',
recovery: 'recovery8@gmail.com'
},
{
userId: 'someuserid',
email: 'email9@gmail.com',
password: 'password9',
recovery: 'recovery9@gmail.com'
}
],
'group-5' => [
{
userId: 'someuserid',
email: 'email8@gmail.com',
password: 'password8',
recovery: 'recovery8@gmail.com'
},
{
userId: 'someuserid',
email: 'email9@gmail.com',
password: 'password9',
recovery: 'recovery9@gmail.com'
}
]
}发布于 2022-11-02 19:39:19
您可以将组保存为“桶”,并找到下一个放入电子邮件的桶。如果没有可用的桶,用电子邮件创建一个新的桶。
const emails=[{userId:'someuserid',email:'email1@gmail.com',password:'password1',recovery:'recovery1@gmail.com'},{userId:'someuserid',email:'email1@gmail.com',password:'password1',recovery:'recovery1@gmail.com'},{userId:'someuserid',email:'email10@gmail.com',password:'password10',recovery:'recovery10@gmail.com'},{userId:'someuserid',email:'email10@gmail.com',password:'password10',recovery:'recovery10@gmail.com'},{userId:'someuserid',email:'email2@gmail.com',password:'password2',recovery:'recovery2@gmail.com'},{userId:'someuserid',email:'email2@gmail.com',password:'password2',recovery:'recovery2@gmail.com'},{userId:'someuserid',email:'email3@gmail.com',password:'password3',recovery:'recovery3@gmail.com'},{userId:'someuserid',email:'email3@gmail.com',password:'password3',recovery:'recovery3@gmail.com'},{userId:'someuserid',email:'email4@gmail.com',password:'password4',recovery:'recovery4@gmail.com'},{userId:'someuserid',email:'email4@gmail.com',password:'password4',recovery:'recovery4@gmail.com'},{userId:'someuserid',email:'email5@gmail.com',password:'password5',recovery:'recovery5@gmail.com'},{userId:'someuserid',email:'email5@gmail.com',password:'password5',recovery:'recovery5@gmail.com'},{userId:'someuserid',email:'email6@gmail.com',password:'password6',recovery:'recovery6@gmail.com'},{userId:'someuserid',email:'email6@gmail.com',password:'password6',recovery:'recovery6@gmail.com'},{userId:'someuserid',email:'email7@gmail.com',password:'password7',recovery:'recovery7@gmail.com'},{userId:'someuserid',email:'email7@gmail.com',password:'password7',recovery:'recovery7@gmail.com'},{userId:'someuserid',email:'email8@gmail.com',password:'password8',recovery:'recovery8@gmail.com'},{userId:'someuserid',email:'email8@gmail.com',password:'password8',recovery:'recovery8@gmail.com'},{userId:'someuserid',email:'email9@gmail.com',password:'password9',recovery:'recovery9@gmail.com'},{userId:'someuserid',email:'email9@gmail.com',password:'password9',recovery:'recovery9@gmail.com'}]
const buckets = [];
const bucketSize = 4;
emails.forEach((e) => {
const bucketIndex = buckets
.map((b, i) => [b, i]) // zip with index
.filter(([b]) => b.length < bucketSize) // buckets that aren't full
.find(([b]) => b.every((u) => u.email !== e.email)); // bucket with available spot
if (bucketIndex === undefined) buckets.push([e]); // create new bucket
else buckets[bucketIndex[1]].push(e); // push to existing bucket by index
});
// zip with keys and create map
const map = new Map(buckets.map((b, i) => [`group-${i}`, b]));
// Just for display - Maps aren't displayed properly in the output yet
console.log(Object.fromEntries(Array.from(map)));.as-console-wrapper { max-height: 100% !important }
发布于 2022-11-02 19:28:31
不确定,但如果您想要一组独特的电子邮件,这将给您4个对象与独特的电子邮件。
chunk函数,这是两个参数,一个是数组,另一个是数组的大小。
const emails = [{
userId: 'someuserid',
email: 'email1@gmail.com',
password: 'password1',
recovery: 'recovery1@gmail.com'
},
{
userId: 'someuserid',
email: 'email1@gmail.com',
password: 'password1',
recovery: 'recovery1@gmail.com'
},
{
userId: 'someuserid',
email: 'email10@gmail.com',
password: 'password10',
recovery: 'recovery10@gmail.com'
},
{
userId: 'someuserid',
email: 'email10@gmail.com',
password: 'password10',
recovery: 'recovery10@gmail.com'
},
{
userId: 'someuserid',
email: 'email2@gmail.com',
password: 'password2',
recovery: 'recovery2@gmail.com'
},
{
userId: 'someuserid',
email: 'email2@gmail.com',
password: 'password2',
recovery: 'recovery2@gmail.com'
},
{
userId: 'someuserid',
email: 'email3@gmail.com',
password: 'password3',
recovery: 'recovery3@gmail.com'
},
{
userId: 'someuserid',
email: 'email3@gmail.com',
password: 'password3',
recovery: 'recovery3@gmail.com'
},
{
userId: 'someuserid',
email: 'email4@gmail.com',
password: 'password4',
recovery: 'recovery4@gmail.com'
},
{
userId: 'someuserid',
email: 'email4@gmail.com',
password: 'password4',
recovery: 'recovery4@gmail.com'
},
{
userId: 'someuserid',
email: 'email5@gmail.com',
password: 'password5',
recovery: 'recovery5@gmail.com'
},
{
userId: 'someuserid',
email: 'email5@gmail.com',
password: 'password5',
recovery: 'recovery5@gmail.com'
},
{
userId: 'someuserid',
email: 'email6@gmail.com',
password: 'password6',
recovery: 'recovery6@gmail.com'
},
{
userId: 'someuserid',
email: 'email6@gmail.com',
password: 'password6',
recovery: 'recovery6@gmail.com'
},
{
userId: 'someuserid',
email: 'email7@gmail.com',
password: 'password7',
recovery: 'recovery7@gmail.com'
},
{
userId: 'someuserid',
email: 'email7@gmail.com',
password: 'password7',
recovery: 'recovery7@gmail.com'
},
{
userId: 'someuserid',
email: 'email8@gmail.com',
password: 'password8',
recovery: 'recovery8@gmail.com'
},
{
userId: 'someuserid',
email: 'email8@gmail.com',
password: 'password8',
recovery: 'recovery8@gmail.com'
},
{
userId: 'someuserid',
email: 'email9@gmail.com',
password: 'password9',
recovery: 'recovery9@gmail.com'
},
{
userId: 'someuserid',
email: 'email9@gmail.com',
password: 'password9',
recovery: 'recovery9@gmail.com'
}
];
let filterdResult = []; // to store unique email objects
// to filter emails object with unique email
let filterArray = emails.reduce((visitedEmailContainer, currentEmail) => {
if (!visitedEmailContainer.includes(currentEmail.email)) {
filterdResult.push(currentEmail);
visitedEmailContainer.push(currentEmail.email);
return visitedEmailContainer;
}
return visitedEmailContainer;
}, []);
function chunk(array, size) {
/*
- Take an empty array to push array chuncks
- check if we will have extra chunks or not;
- if array length's moudle with chunk size is not equal to zero that we have to count the number of rounds
- if array length's moudle with chunk size is zero than we just need to push array.splice(0,size) till the array size is not equals to zero
- if we have rounds , than we just need to push array till the rounds are not complete once its compelete we just need to add extra to result by arra.push(0,extra);
- In other words,push chunks in array till our array's length is not equal to extra and once array length is just as extra add remaining by arra.push(0,extra);
*/
let result = [];
let extra = array.length % size;
if (extra == 0) {
while (array.length !== 0) {
result.push(array.splice(0, size));
}
} else if (extra) {
while (array.length != extra) {
result.push(array.splice(0, size));
}
result.push(array.splice(0, extra));
}
console.log(result);
return result;
}
chunk(filterdResult, 4);
https://stackoverflow.com/questions/74294413
复制相似问题