首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将重复对象的列表分组,而不将重复移到映射中。

将重复对象的列表分组,而不将重复移到映射中。
EN

Stack Overflow用户
提问于 2022-11-02 19:01:39
回答 2查看 46关注 0票数 0

数组中有一个对象列表。每个对象都有一封电子邮件。

数组可能有重复的电子邮件,我想保留它们。

我想给出一个数字,比方说4,它应该把电子邮件分成4组,成一张地图,其中键就像组-1.在这个例子中,每个键中的值4是唯一的电子邮件,我将有一张5键的地图。

代码语言:javascript
复制
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'
    }
  ]
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-02 19:39:19

您可以将组保存为“桶”,并找到下一个放入电子邮件的桶。如果没有可用的桶,用电子邮件创建一个新的桶。

代码语言:javascript
复制
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)));
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important }

票数 0
EN

Stack Overflow用户

发布于 2022-11-02 19:28:31

不确定,但如果您想要一组独特的电子邮件,这将给您4个对象与独特的电子邮件。

  • 首先我是过滤具有电子邮件唯一值的数组,而不是使用chunk函数,这是两个参数,一个是数组,另一个是数组的大小。
  • 块函数的过程如下,这里缺少的唯一东西**这里缺少的是关键,否则您将得到4个电子邮件块的数组对象。
  • 采用一个空数组来推送数组块,
  • 检查我们是否会有额外的块;如果具有块大小的数组长度的大小不等于零,则
  • ,如果数组长度的块大小为零,则必须计算
  • 的轮数,而不是只需将array.splice(0,size)推送到数组大小不等于零
  • (如果有轮时),而只需推送数组直到其compelete未完成时,我们只需在arra.push(0,额外)的结果中添加额外的;
  • ,换句话说,将数组中的块按在数组中,直到数组的长度不等于额外,并且一旦数组长度与arra.push(0,extra )保持的额外相加一样;

代码语言:javascript
复制
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);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74294413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档