我有两个对象:
ej= {
name="",
code: "",
namebusinessG:"",
codebusinessG:""
};
group = {
name:"",
code:""
}
两个包含这些对象的数组
groupList:any[]=[];
ejList:any[]=[];
我的程序应该像这样工作:
将组添加到groupList时:测试groupList中是否存在组,如果不存在则
在ejList中添加ej:在ejList中测试如果ej存在,如果不存在,则添加它。然后程序应该将ej.codebusinessG和ej.namebusinessG添加到groupList,但是如果ej.codebusinessG已经存在于groupList.code列表中,它应该验证之前,如果没有,则添加它。
selectItem(event) {
if (!this.toggle) { // in group
if (this.groupList.length == 0) {
this.groupList.push(event);
} else if (this.testNotExistinginArray(event, this.groupList)) {
this.groupList.push(event);
}
} else { //in ej
if (this.ejList.length == 0) {
this.ejList.push(event);
if (this.groupList.length == 0) {
this.groupList.push({
code: event.codebusinessG,
name: event.nameBusinessG
});
}
} else if (this.testNotExistinginArray(event, this.ejList)) {
this.ejList.push(event);
this.group.code = event.codeBusinessG;
this.group.name = event.nameBusinessG;
if (this.testNotExistinginArray(this.group, this.groupList)) {
this.groupList.push(this.group);
}
}
}
}
这是测试代码是否在数组中的函数:
testNotExistinginArray(event,type) {
let notExist=true;
type.forEach (function(elm) {
if(elm.code === event.code) {
notExist=false
}
})
return notExist;
}
实际行为
当我添加组:验证+添加确定
当我添加ej:verificiation +添加确定
时但是在第一次和第二次添加ej之后,正确添加了组对应组。
但是当我添加第三个ej时,ej被添加到列表中,但相应的组会覆盖groupList中的最后一个项目。
以下是更多详情
当我添加第一个ej。 (添加了ej和组)
当我添加第二个(添加了ej和组)
然后我是第三个
codebusinessG会覆盖groupList中的最后一个组,而不是在它之后添加。
预期行为
添加ej
时,在groupList中的最后一个项目之后添加ej.codebusinessG + ej.namebusinessG。
有关我正在使用角度5和Primeng autocomplete component的信息:
<p-autoComplete [(ngModel)]="text" [suggestions]="results" (completeMethod)="search($event)"
emptyMessage={{noBorrowerResult}}
[minLength]="3"
placeholder="Exemple: Apple"
[size] = "40"
field = "name"
[multiple]="true"
>
<ng-template let-elm pTemplate="item">
<div class="suggestion-item">{{elm.name}} ( ID: {{elm.code}} )</div>
</ng-template>
</p-autoComplete>
答案 0 :(得分:2)
我简化了您的代码,并为您提供了 this stackblitz 的示例。
addUniqueObjectToArray(obj, array, criteria, criteriaTwo?) {
if (array.some(g => g[criteria] === obj[criteriaTwo ? criteriaTwo : criteria])) { return; }
array.push(obj);
}
ngOnInit() {
this.addUniqueObjectToArray(this.newGroup, this.groupList, 'code');
this.addUniqueObjectToArray(this.newGroup, this.groupList, 'code');
this.addUniqueObjectToArray(this.ej, this.ejList, 'code');
this.addUniqueObjectToArray(this.ej, this.ejList, 'code');
this.addUniqueObjectToArray(this.ej, this.groupList, 'code', 'codebusinessG');
this.addUniqueObjectToArray(this.ej, this.groupList, 'code', 'codebusinessG');
console.log('Groups : ', this.groupList, ' EJs : ', this.ejList);
}
现在你有一个do-it-all函数来比较两个键,只有当数组不包含这个键时才推入数组。
如果只传递一个键,它将在此键上进行比较,否则您可以传递另一个键来更改比较功能。随意在stackblitz中尝试它,它是为此而制作的。
编辑为避免引用问题:
this.addUniqueObjectToArray({code: 'CODE'}, this.ejList, 'code');
const newObj = {code: 'CODE'};
this.addUniqueObjectToArray(newObj, this.ejList, 'code');
为函数提供一个新对象,而不是已经创建的对象。