防止 Angular 中 .push() 中的元素 id 重复

Posted

技术标签:

【中文标题】防止 Angular 中 .push() 中的元素 id 重复【英文标题】:Prevent duplication of element id in .push() in Angular 【发布时间】:2020-06-14 15:27:00 【问题描述】:

我有一个名为 users 的对象数组,它在我的组件中定义为users: Array<GroupUser> = [];,我的目标是检查新申请人是否与数组中已经存在的任何用户的 id 不同。

这是我的 GroupUser 模型:

export class GroupUser 
  id?: number;
  user: number;
  permissions: string;
  confirmed?: boolean;

我收到您在此函数中从后端手动输入的带有 id 的申请人数据:

onKey(event: any) 
  this.adminId = event.target.value;
  this.authService.getSpecUser(this.adminId).subscribe(
    (data => 
      this.admin = data;
    )
  );

所以基本上我想检查 adminId(我的组件中的adminId: number;)是否等于我的数组中已经存在的任何 users.user 值。

我已经尝试使用不同的函数来实现结果:

for (let i = 0; i < this.users.length; i++) 
    if (this.admins.indexOf(this.users[i]) !== -1) 
      this.users.push(user: this.adminId, permissions: this.g.admin_rights.value);
    
  

for (let i = 0; i < this.users.length; i++) 
       console.log(this.users[i].user, this.adminId)
       if (this.users[i].user != this.adminId) 
         this.users.push(user: this.adminId, permissions: this.g.admin_rights.value);
      
     

但是即使新用户具有相同的 id,也会将新用户添加到数组中。我认为 some() 方法可以提供帮助,但我不确定如何在这里正确使用它。

所以基本上我会在将用户添加到组之前检查用户是否已经在组中。平台上有很多用户,这些用户有很多组,在我将新用户添加到组之前,我必须检查他是否已经存在。

任何帮助将不胜感激。

【问题讨论】:

this.adminthis.admins 是什么?它们与this.adminIdthis.users 有什么关系?您可以在它们各自的类中显示所有这些属性的声明,而不是在文本中解释它。 这些是我在测试中使用的值:admin: object = null; admins: Array&lt;object&gt; = []; @LogicBlower - 具有相同id 的两个用户可以添加到Set,因为它们是不同的对象。 Id 和用户(在 GroupUser 类中)必须是唯一的,其他 2 个值不能是唯一的 @LogicBlower - 如果您的问题是关于Set,两个具有相同属性值的对象仍然是不同的对象。所以他们可以在同一个Set。换句话说obj1 !== obj2,即使所有属性值都相同。 【参考方案1】:

您可以通过以下方式使用数组some()

var input = [
   id: 1, user: 32, permissions: 'sample', confirmed: false ,
   id: 2, user: 41, permissions: 'sample', confirmed: false ,
   id: 3, user: 12, permissions: 'sample', confirmed: false ,
   id: 4, user: 5, permissions: 'sample', confirmed: false ,
   id: 5, user: 78, permissions: 'sample', confirmed: false 
];

var found = (input, adminId) => input.some(user => user.user === adminId);

if (!found(input, 41))   // don't push
  input.push( id: 5, user: 41, permissions: 'sample', confirmed: false )

if (!found(input, 62))   // push
  input.push( id: 6, user: 62, permissions: 'sample', confirmed: false )

if (!found(input, 62))   // don't push
  input.push( id: 2, user: 62, permissions: 'sample', confirmed: false )

if (!found(input, 17))   // push
  input.push( id: 6, user: 17, permissions: 'sample', confirmed: false )


console.log(input);

对于您的用例,它可以用作

if(!this.users.some(user => user.user === this.adminId)) 
  this.users.push(user: this.adminId, permissions: this.g.admin_rights.value);

【讨论】:

非常感谢。这正是我想要做的【参考方案2】:

只有在您检查完所有新用户后,您才需要添加新用户。相反,您将它放在 for 循环的中间,因此它会一遍又一遍地添加它。

试试这个:

var doesExistFlag = false;
for (let i = 0; i < this.users.length; i++) 
   if (this.users[i].user == this.adminId) 
     doesExistFlag = true;
   
 

if(!doesExistFlag)
   this.users.push(user: this.adminId, permissions: this.g.admin_rights.value);

更好的解决方案是根据时间戳生成随机 id。

【讨论】:

为什么是随机 ID? 他不是想为每个用户创建一个唯一的 id 吗? 谢谢 Rick,flag 效果很好,但我想我可以在 for 循环中或在 some() 方法的帮助下做到这一点。我不想为每个用户创建一个唯一的 id,这些用户已经存在于数据库中,我只是想在将用户添加到那里之前检查用户是否已经在组中。所以基本上我正在将新用户添加到组中,我必须检查他是否已经存在。【参考方案3】:

id 是字段的名称......永远不会被比较。

为了便于阅读,adminId 可能应该是 userId

坦率地说,已经在服务器端进行排序了。

【讨论】:

以上是关于防止 Angular 中 .push() 中的元素 id 重复的主要内容,如果未能解决你的问题,请参考以下文章

在 Angular Material CDK 拖放中,如何防止项目随着元素移动而自动重新排列?

防止 Angular 2 中的内存泄漏?

防止 Angular 11 应用程序中的 JQuery 默认行为

Angular - 防止在输入类型=“数字”中输入超出范围的数字

构造函数中的变量初始化速度不够快,无法防止 html 代码中的空指针异常 [Angular]

Cookie 中的 Angular JWT 如何防止 CSRF/XSRF 和 XSS