push()函数覆盖数组中的最后一项

时间:2018-03-22 12:10:40

标签: angular typescript primeng

我有两个对象:

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和组)

enter image description here

当我添加第二个(添加了ej和组)

enter image description here

然后我是第三个

enter image description here

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>

1 个答案:

答案 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');

为函数提供一个新对象,而不是已经创建的对象。