防止 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.admin
和 this.admins
是什么?它们与this.adminId
和this.users
有什么关系?您可以在它们各自的类中显示所有这些属性的声明,而不是在文本中解释它。
这些是我在测试中使用的值:admin: object = null; admins: Array<object> = [];
@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 11 应用程序中的 JQuery 默认行为
Angular - 防止在输入类型=“数字”中输入超出范围的数字